【问题标题】:Entity Framework Query - how to return desired results实体框架查询 - 如何返回所需的结果
【发布时间】:2017-12-10 17:03:01
【问题描述】:

我有这个问题

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用于存储特定ItemsTags

我只需要List<Tag_Group> 来购买库存商品。有没有更好的方法来做到这一点?

【问题讨论】:

  • 您是否尝试过查看生成的 SQL 语句并自己针对数据库运行它?这个 EF 查询对我来说看起来不错,但我看不出有什么问题。
  • 将任何更改为位置。也许这是一个解决方案。

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


【解决方案1】:

这是一个变相的“过滤包含”问题,答案类似于通常的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 集合时,它们不会被完全填充。

【讨论】:

    【解决方案2】:

    会不会是因为您的& 而不是&& 而导致您得到错误的结果?

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

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

    您似乎想要在其Tags 序列中至少有一个Tag 的所有Tag_Group 对象:

    • 有一个CategoryName 等于“|” + 类别 ID + "|"
    • ANDTag_List 中至少有一项具有ItemOnStock > 0

    或者是你想要所有的Tag_Group对象

    • Tags 中至少有一个Tag,其中CategoryName 等于“|” + 类别 ID + "|"
    • Tags 中至少有一个TagTag_List 中至少有一个具有ItemOnStock > 0 的项目。这个Tag 可能与CategoryNameTag 不同

    我假设您需要 AND 选项。

    虽然您没有这么说,但我假设 db 是您的 dbContext,并且您希望您的查询由数据库执行,因此是 AsQueryable,而不是 AsEnumerable。

    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());
    

    【讨论】:

      【解决方案3】:

      谢谢你们的帮助:)

      我最终使用了稍微修改的 Gert 的答案,因为我需要按 TagGroup 分组的标签

      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();
      

      我从你的回答中学到了很多

      【讨论】:

        猜你喜欢
        • 2018-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-09
        • 2015-06-16
        • 2011-12-18
        相关资源
        最近更新 更多