LINQ继承查询

本文关键字:查询 继承 LINQ | 更新日期: 2023-09-27 17:51:14

我正在支持一个系统,该系统具有属于顶级实体的组的层次结构。从概念上看是这样的:

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继承查询

这个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