加入 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的主要内容,如果未能解决你的问题,请参考以下文章