我有这个查询
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
和许多Tags
。 Tag_Group
有很多Tags
表Tag_List
用于存储特定Tags
的{{1}}。
对于库存商品,我只需要Items
。有没有更好的方法来做到这一点?
答案 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_Group
。 Tag_Group
的每个对象都有零个或多个Tags
。
每个Tag
都有一个字符串CategoryName
和一个包含零个或多个Tag_List
的IEnumerable Items
。每个Item
都有一个int(?)属性ItemOnStock
。 int
部分并不重要。它可以是任何类,只要你可以将它与零进行比较。
您似乎希望所有Tag_Group
个对象在其Tag
序列中至少有一个Tags
:
CategoryName
等于“|” + CategoryID +“|”Tag_List
中至少有一个项目ItemOnStock > 0
或者可能是您希望所有Tag_Group
个对象
Tag
中至少有一个Tags
且CategoryName
等于“|” + CategoryID +“|”Tag
中至少有一个Tags
,Tag_List
中有一个项目ItemOnStock > 0
。Tag
。此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();
我从你的答案中学到了很多东西