我正在支持一个系统,该系统具有属于顶级实体的组的层次结构。从概念上看是这样的:
id | Group | parent
-------------------------
10 | Enterprise | N/A
20 | Partner A | 10
21 | Partner B | 10
29 | Business Q | 21
实际的组表是这样的:
int | GroupID
int | BusinessID (nullable)
int | PartnerID (nullable)
所以数据看起来是这样的:
GrpID | PtnrID | BzID | Name
------------------------------------
10 | null | null | Enterprise
20 | 10 | null | Partner A
21 | 10 | null | Partner B
29 | 10 | 21 | Business Q
不是引用父组的组,而是存储partnerid和businessid,它们是可空的,并指向另一个组的GroupID。
组特定的设置可以存储在任何级别。企业定义默认值,但合作伙伴和业务实体可以重写。例:
10 | color | red
20 | color | blue
29 | color | green
这将导致以下设置
Enterprise | red
Partner A | blue
Partner B | red
Business | green
我正试图编写一个linq查询,获得给定组的设置,但我遇到麻烦
from set in GroupSettings
from grp in Groups
where set.setting=="color" && grp.GroupID==29 &&
(
set.GroupID==grp.BusinessID || set.GroupID==grp.PartnerID
)
select set
返回Enterprise的定义和业务
的覆盖值。10 | red
29 | green
是否有一种语法,我可以使用它来给我(因为缺乏更好的术语)排他性或功能性在我的where子句中,如果当前的子句不满足,只会落到下一个或语句?我的目标是只返回相关的行——在本例中是29 | green
。
这个Linq查询确实为您的问题中的情况产生正确的输出。我基本上有三个左外连接在group和它自己的设置,它的业务设置和它的伙伴设置之间。这给出了一个有3个值的结果。投影选择第一个非空值。
var r = from grp in Groups
join da in GroupSettings on grp.GroupID equals da.GroupID into ga // direct
join db in GroupSettings on grp.BzId equals db.GroupID into gb // Busisness
join dc in GroupSettings on grp.PartnerId equals dc.GroupID into gc // Partner
from gar in ga.DefaultIfEmpty()
from gbr in gb.DefaultIfEmpty()
from gcr in gc.DefaultIfEmpty()
where grp.GroupID == 29
select new { setting = gar ?? gbr ?? gcr }; // null coalesce