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

C# 如何使用GroupBy和LEFT JOIN进行LINQ查询,c#,linq,linq-to-entities,c#-4.0,C#,Linq,Linq To Entities,C# 4.0,我正在使用EF4,我需要使用LINQ进行此查询,但我不知道如何进行 如果我有3张桌子: 产品类型 产品 时令 产品类型->一对多->产品->多对一->季节 我想要一份一季所有产品类型及其产品的清单。请注意,我需要列出所有的产品类型,即使里面没有该季节的产品 谢谢你的帮助 试试这个: var query = from pt in model.ProductTypes join p in model.Product.Where(p => p.SeasonId ==

我正在使用EF4,我需要使用LINQ进行此查询,但我不知道如何进行

如果我有3张桌子:

  • 产品类型
  • 产品
  • 时令
产品类型->一对多->产品->多对一->季节

我想要一份一季所有产品类型及其产品的清单。请注意,我需要列出所有的产品类型,即使里面没有该季节的产品

谢谢你的帮助

试试这个:

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 };

我得承认我对加入
总是有些生疏。。。进入
,但我认为这将满足您的要求。

假设您确实想要左加入,根据您的问题,请执行以下操作:

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

它起作用了!非常感谢。但是你知道我应该把它放在我的存储库中还是应该放在控制器中吗?如果它在存储库中,我将不得不创建一个要返回的新对象。我不确定这是一个好的方式做这件事@说实话,我真的不知道。我决定把它放在控制器里,因为它是视图的专用工具。而且一定更容易!这是一个内部连接,不是左连接。@Craig:使用“连接到”而不是“连接”执行组连接,当左元素与任何内容不匹配时,包括空的右序列。这样可读性更好。但我不明白为什么乔恩的版本即使是内部连接也能起作用。非常感谢你!只要数据恰好在两侧,内部连接就可以正常工作。奇怪的是,我有一些产品类型没有任何产品,而且一切都很好。无论如何,你的解决方案一切都很好:)不,我的不是内部连接。如果查看编译后的代码,它将使用
Queryable.GroupJoin
,这是LINQ与真正的左连接最近的一个连接。(它通常与
DefaultIfEmpty
组合在一起,以右边的空值结束,但在这种情况下不需要它。)