[英]Entity Framework Query - how to return desired results
我有這個查詢
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
用於存儲特定Items
Tags
。
我只需要List<Tag_Group>
庫存。 有更好的方法嗎?
這是一個偽裝的“已過濾的包含”問題,答案與通常的變通方法類似,因為在Include
缺少過濾 。
在您的情況下,最好在Tags
處啟動查詢,並按其TagGroup
對其進行TagGroup
(我認為其中存在Navigation屬性):
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
集合。
可能是因為您的&
而不是&&
導致了錯誤的結果?
因此,您有一個Tag_Group
類。 Tag_Group
每個對象都有零個或多個Tags
。
每個Tag
都有一個字符串CategoryName
和一個IEnumerable Tag_List
,該列表包含零個或多個Items
。 每個Item
都有一個int(?)屬性ItemOnStock
。 int
部分並不重要。 它可以是任何類,只要您可以將其與零進行比較即可。
似乎您希望所有Tag_Group
對象在其Tags
序列中至少具有一個Tag
,這些Tags
應:
CategoryName
等於“ |” + CategoryID +“ |” Tag_List
中至少有一個ItemOnStock > 0
或者是您想要所有Tag_Group
對象
Tag
在Tags
與CategoryName
等於“|” + CategoryID +“ |” Tag
在Tags
,在具有監聽中心一個項目Tag_List
有一個ItemOnStock > 0
。 該Tag
可能與帶有CategoryName
Tag
不同 我假設您想要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());
謝謝你們的幫助:)
我最終使用了經過修改的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();
我從你的答案中學到了很多
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.