实体框架查询 - 如何返回所需的结果

时间:2017-12-10 17:03:02

标签: c# asp.net asp.net-mvc entity-framework linq

我有这个查询

ViewBag.Tags = db.Tag_Group
   .Where(u => 
      u.Tags.Any(d => d.CategoryName.Contains("|" + CategoryID + "|")) 
      & u.Tags.Any(s=>s.Tag_List.Any(d=>d.Item.ItemsOnStock>0)))
   .OrderBy(y => y.TagGrupName)
   .ToList();

它返回所有组,而不仅仅是ItemsOnStock>0组。

我做错了什么?

Tag_List有许多Item和许多TagsTag_Group有很多Tags

Tag_List用于存储特定Tags的{​​{1}}。

对于库存商品,我只需要Items。有没有更好的方法来做到这一点?

3 个答案:

答案 0 :(得分:0)

这是一个伪装的“过滤包含”问题,答案类似于通常的work-around for lack of filtering in Include

在您的情况下,您最好在Tags开始查询并按TagGroup对其进行分组(我假设导航属性存在):

db.Tags
  .Where(t => t.CategoryName.Contains("|" + CategoryID + "|") 
           && t.Tag_List.Any(d => d.Item.ItemsOnStock > 0))
  .GroupBy(t => t.TagGroup)
  .AsEnumerable()
  .Select(g => g.Key)
  .OrderBy(y => y.TagGroupName)
  .ToList();

请记住禁用延迟加载,因此当您访问它们时,不会完全填充组Tags个集合。

答案 1 :(得分:0)

由于您的&代替&&,可能会导致错误的结果吗?

所以你有一个班级Tag_GroupTag_Group的每个对象都有零个或多个Tags

每个Tag都有一个字符串CategoryName和一个包含零个或多个Tag_List的IEnumerable Items。每个Item都有一个int(?)属性ItemOnStockint部分并不重要。它可以是任何类,只要你可以将它与零进行比较。

您似乎希望所有Tag_Group个对象在其Tag序列中至少有一个Tags

  • CategoryName等于“|” + CategoryID +“|”
  • AND Tag_List中至少有一个项目ItemOnStock > 0

或者可能是您希望所有Tag_Group个对象

  • Tag中至少有一个TagsCategoryName等于“|” + CategoryID +“|”
  • Tag中至少有一个TagsTag_List中有一个项目ItemOnStock > 0Tag。此Tag可能与CategoryName
  • var CategoryId = ... string categoryName = "|" + CategoryId + "|"; var result = db.Tag_Group // I want only those tagGroupElements that have at least one Tag // in sequence Tags that matches both conditions: .Where(tagGroupElement => tagGroupEleent.Tags // the tagGroupElement should have a matching CategoryName .Where(tag => tag.CategoryName == categoryName) // and the tagGroupElement should have at least one item // in Tag_List with ItemOnStock > 0 && tag.Tag_List .Where(tagListElement => tagListElement.ItemOnStock > 0) .Any()) .Any()); 不同{{1}}

我假设你想要AND选项。

虽然你没有这么说,但我认为db是你的dbContext,你希望你的查询由数据库执行,所以AsQueryable,而不是AsEnumerable。

{{1}}

答案 2 :(得分:0)

谢谢你们的帮助:)

由于我需要按TagGroup分组的标签

,我最终使用了一点修改后的Gert的答案
db.Tags
  .Where(t => t.CategoryName.Contains("|" + CategoryID + "|") 
           && t.Tag_List.Any(d => d.Item.ItemsOnStock > 0))
  .GroupBy(t => t.TagGroup.GroupName)
  .OrderBy(y => y.Key)
  .ToList();

我从你的答案中学到了很多东西