【发布时间】:2018-06-11 03:53:24
【问题描述】:
我对我的问题进行了很多搜索,但没有找到任何明确的解决方案。我只知道我不能将 Where linq 子句与 Include 一起使用,但对我而言,我如何进行此查询没有意义。
var brands = await _context.Brands
.Include(x => x.FoodCategories
.Select(y => y.Products
.Where(z => z.Sugar)
.Select(w => w.FileDetail)))
.ToListAsync();
实际上,我想在 Products 上应用 Where 语句,但我想要像我在这里做的那样层次结构中的实体。我该怎么做?
我已经尝试过使用不同的 stackoverflow 问题answer,但我不明白这一点。这是我的试验:
var brands = _context.Brands
.Select(b => new
{
b,
FoodCategories = b.FoodCategories
.Where(x => x.BrandId == b.BrandId)
.Select(c => new
{
c,
Products = c.Products
.Where(y => y.FoodCategoryId == c.FoodCategoryId &&
y.Sugar)
.Select(p => new
{
p,
File = p.FileDetail
})
})
})
.AsEnumerable()
.Select(z => z.b)
.ToList();
但它并没有退回所有产品,而是仅退回糖产品。
【问题讨论】:
-
我认为您必须使用 SelectMany 来选择实体的详细信息。
-
您不能在包含中使用
Where语句。包含语句基于实体的结构,而Where仅过滤集合中的数据。一个与另一个无关。即使您认为“仅当父母符合这些标准时才包括父母”之类的事情会很好,但这根本不是Include的设计方式。包含归结为“对于每个 [type1],还加载它们相关的 [type2]”。这将针对您的查询将实例化的 every [type1] 对象完成,并且它将加载 every 相关的 [type2]。 -
您在链接的答案中缺少以下部分 - “这仅在禁用延迟加载时有效。” 您在当前答案下发布的屏幕截图清楚地表明延迟加载处于活动状态,这会抵消您的所有努力。
-
@IvanStoev 你是美女,现在一切正常。您能否编辑 Flater 的答案。我会把它标记为我的问题的答案。
标签: c# asp.net-mvc linq