如何使用GroupBy和LEFT JOIN进行LINQ查询

3
我正在使用EF4,并且我需要使用LINQ进行此查询,但我不知道如何操作。
如果我有三个表:
- ProductType - Product - Season
ProductType -> 一对多 -> Product -> 多对一 -> Season
我想要列出所有ProductType及其在一个Season中的产品列表。请注意,即使该Season中没有任何产品,我也需要列出所有的ProductType。
谢谢您的帮助!
2个回答

4

试试这个:

var query = from pt in model.ProductTypes
            join p in model.Product.Where(p => p.SeasonId == seasonId)
               on pt.Id equals p.ProductTypeId into g
            select new { ProductType = pt, Products = g };

我不得不承认,我对join ... into有点生疏,但是我认为这个可以实现你想要的功能。


可以了!谢谢你!但是你知道这是应该放在我的代码库里还是控制器里吗?如果它在代码库里,我将不得不创建一个新的对象来返回。我不确定这是否是一个好的做法! - Alexandre Jobin
@Alexandre:说实话,我真的不知道。 - Jon Skeet
我决定将它放在控制器中,因为它是特定于视图的。这样会更容易! - Alexandre Jobin
这是一个内连接,不是左连接。 - Craig Stuntz
@Craig:使用“join into”而不仅仅是“join”执行组连接,当左元素没有匹配时,它包括空的右序列。 - Jon Skeet

2

假设您需要进行左连接,按照您的问题,操作如下:

var query = from pt in model.ProductTypes
            select new
            {
                ProductType = pt,
                Products = from p in pt.Products
                           where p.SeasonId == seasonId
                           select p
            };

但我不明白为什么Jon的版本也能工作,即使它是一个内连接(inner join)。非常感谢! - Alexandre Jobin
内连接只要数据恰好在两侧都存在,就可以正常运行。 - Craig Stuntz
奇怪的是,我有一些没有任何产品的产品类型,但一切都很好。无论如何,你的解决方案非常有效 :) - Alexandre Jobin
不,我的查询并不是内连接。如果你查看编译后的代码,它会使用 Queryable.GroupJoin,这是 LINQ 中最接近真正左连接的方法。(通常与 DefaultIfEmpty 结合使用,在右侧得到一个空值,但在这种情况下没有必要。) - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接