一尘不染

LINQ:结合加入和分组

c#

我有一个结合了联接和组的查询,但是我遇到了问题。查询就像:

 var result = from p in Products                         
 join bp in BaseProducts on p.BaseProductId equals bp.Id                    
 group p by p.SomeId into pg                         
 select new ProductPriceMinMax { 
       SomeId = pg.FirstOrDefault().SomeId, 
       CountryCode = pg.FirstOrDefault().CountryCode, 
       MinPrice = pg.Min(m => m.Price), 
       MaxPrice = pg.Max(m => m.Price),
       BaseProductName = bp.Name  <------ can't use bp. 
 };

如您所见,它将Products表与BaseProducts表联接在一起,并在Product表的ID上分组。但是在生成的ProductPriceMinMax中,我还需要BaseProducts表的一个属性:bp.Name,但它不知道bp。

知道我在做什么错吗?

谢谢!


阅读 300

收藏
2020-05-19

共1个答案

一尘不染

完成此操作后

group p by p.SomeId into pg

您将无法再访问初始值中使用的范围变量from。也就是说,您不能再谈论p或者bp,您只能谈论pg

现在,pg是一个 ,因此包含 多个
产品。给定pg组中的所有产品都相同SomeId(因为这是您的分组依据),但是我不知道这是否意味着它们都相同BaseProductId

要获得基本产品名称,您必须在pg组中选择一个特定产品(与SomeId和一样CountryCode), 然后
加入BaseProducts

var result = from p in Products                         
 group p by p.SomeId into pg                         
 // join *after* group
 join bp in BaseProducts on pg.FirstOrDefault().BaseProductId equals bp.Id         
 select new ProductPriceMinMax { 
       SomeId = pg.FirstOrDefault().SomeId, 
       CountryCode = pg.FirstOrDefault().CountryCode, 
       MinPrice = pg.Min(m => m.Price), 
       MaxPrice = pg.Max(m => m.Price),
       BaseProductName = bp.Name  // now there is a 'bp' in scope
 };

也就是说,这看起来很不寻常,我认为您应该退后一步,考虑一下您实际尝试检索的内容。

2020-05-19