【问题标题】:LINQ inheritance queryLINQ 继承查询
【发布时间】:2014-03-22 00:28:18
【问题描述】:

我支持的系统具有属于顶级实体的组层次结构。从概念上讲,它看起来像这样:

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

组存储的是可以为空并指向另一个组的 GroupID 的 partnerid 和 businessid,而不是引用父组的组。

组特定的设置可以存储在任何级别。企业定义默认值,但合作伙伴和业务实体可以覆盖。例如:

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

这将返回企业的定义和业务的覆盖值

10 | red
29 | green

有没有一种我可以使用的语法在我的 where 子句中为我(因为没有更好的术语)提供独占性或功能,如果不满足当前的条件,它只会落入下一个 or 语句?我的目标是只返回相关行 - 在这种情况下是 29 | green

【问题讨论】:

  • 我用更多信息更新了我的帖子。我试图尽可能减少问题......
  • 我以表格格式表示数据。它可能看起来有点奇怪,因为它是实际系统的部分表示

标签: c# sql linq linq-to-sql hierarchy


【解决方案1】:

此 Linq 查询确实会针对您的问题中的情况产生正确的输出。我基本上在组和它自己的设置、它的业务设置和它的合作伙伴设置之间有三个左外连接。这给出了具有 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

【讨论】:

  • 为解决方案提供的道具。不幸的是,当我使用 Linq-to-SQL 尝试此操作时,它会执行连接并返回比我正在寻找的奇异值更大的结果集。
  • 我担心会发生这种情况...您能否将示例数据添加到您的问题中,这会导致错误的结果?我会尽力解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多