加入 linq

Posted

技术标签:

【中文标题】加入 linq【英文标题】:Joining with linq 【发布时间】:2021-06-28 16:25:04 【问题描述】:

我有以下 linq 语句。它从 allStores 返回所有内容。我删除了 DefaultIfEmpty,然后它只返回了 subs 表和 allStores 表中的商店。我需要它返回 subs 表中的所有商店,即使它们不在 allStores 表中。我尝试了一些不同的方法,并绕过了 defaultifempty,但似乎无法让它返回我需要的东西。

我需要返回存储 1、2、4、5(表 2 中的所有内容),并且我需要从表 3 中提取 storeId 的部门 ID 和表 3 中的地址。即使存储不在地址中表与否在 divisionID 表中我仍然需要查询中返回的 storeID。

from a in allStores
   join sub in subs on a.DivisionId equals sub.DivisionId
   join d in divs on new  a.DivisionId, a.StoreId  equals new  d.DivisionId, d.StoreId  into s
   from selected in s.DefaultIfEmpty()
StoreId Address
1 1234 Elm St.
2 5678 Maple St.
3 9101 Bella Ave.
4 1234 Meadow Dr.
StoreId StoreStatus
1 Closed
2 Open
4 Open
5 Open
StoreId DivisionId
1 12
2 14
3 16
4 18
5 20

【问题讨论】:

请添加一些示例数据 from 语句中的第一个表需要包含您想要包含的所有项目,然后其他表具有“DefaultIfEmpty”。一些示例数据和预期结果会有所帮助 我添加了一些示例数据 您的示例数据不完整,无法与您的代码一起使用。正如您在对我的回答的评论中提到的那样,您淡化了它。但是你不能把它淡化到你的代码没有意义的程度。考虑修改。 实际上,您上面的语句“from 语句中的第一个表需要包含您想要包含的所有项目,然后其他表具有 `DefaultIfEmpty'”正是我所需要的。所以这帮助了我。在我这样做之后,我现在开始工作了。 【参考方案1】:

您正在寻找多个左连接。我注意到在这方面的问题中有很多几乎重复的问题。但是其中许多只讨论了一个左连接,其他人没有描述需要处理空引用异常,还有一些人描述了 linq-to-sql 或类似而不是 linq-to-objects,这似乎是你的情况.

您的示例数据不完整,因此我相信您加入的字段是正确的。您即将加入divs。但是您需要为subs 做同样的事情,并且您需要添加一个select 段,以输出从每个源中提取属性的每一行的最终形状。

var results = 

    from a in allStores

    // left join allScores with "subs"
    join sub in subs on a.DivisionId equals sub.DivisionId into subG
    from sub in subG.DefaultIfEmpty()

    // left join allScores with divs
    join div in divs 
        on new  a.DivisonId, a.StoreId  
        equals new  div.DivisionId, div.StoreId  
        into divG
    from div in divG.DefaultIfEmpty() 

    // select properties from all sources, keeping in mind some are null
    select new  
        a.StoreId, 
        a.StoreStatus,
        sub?.Address,  // if you have a newer version of c#
        DivisonId = div == null ? null : (int?)div.DivisionId // if you have an older version of c#
    ;
    

【讨论】:

好吧,我淡化了“数据”示例,只是为了让生活更轻松,但我确实需要按照我们的数据结构方式加入商店和部门 id。为了简单起见,我没有包括更多的数据元素。我只需要修改这个 linq 语句,以将所有存储都包含在 subs 中,并且只在可用时提取地址和分区数据。 所以 DivisionId 存在于所有表中?而且每个店铺可以有多个部门,但每个部门只能有一个店铺? 好的,已编辑。让我知道它是否满足您的需求。 这对现在正在工作的一些调整有很大帮助。谢谢。 很高兴听到这个消息。如果对您有帮助,请考虑接受答案。

以上是关于加入 linq的主要内容,如果未能解决你的问题,请参考以下文章

.NET知识梳理——7.Linq

C#开始使用 LINQ

linQ!!增删改查 好用!

C#中的LINQ

C#中的LINQ

C#图解教程 第十九章 LINQ