[英]linq where contains ALL items in list
我有一個過濾器列表,我想用它來查詢一個表,其中返回的項目包含所有值,而不僅僅是 1。
例如,我有一個標簽/標簽系統。 我想返回其中包含“運動”和“足球”標簽的記錄。 然而,'sport' 和 'football' 存儲在一個列表中,並且可以是用戶提供的任意數量的其他標簽。
我正在使用實體框架。 我有一個 Tags、Teams、TeamTags 表。 我當前的查詢是這樣的:
string _tags = "sport,football";
List<string> tags = _tags.Split(',').ToList();
var teams = (from t in db.Tags where tags.Contains(t.TagName) select t.Teams).FirstOrDefault().Select(i => i.TeamNames).ToList()
但這將返回所有具有“運動”標簽的球隊,而不是那些僅被標記為“運動”和“足球”的球隊。
如果您想象先輸入“運動”標簽,您會得到所有運動隊的列表。 然后,您添加“足球”標簽,該標簽將被更多地過濾到足球隊。 所以我上面的代碼基本上在 where 中做了一個或。 我也希望能夠執行 AND。
因此數據庫中的示例數據為:
野馬隊有運動和足球標簽 大都會隊有運動和棒球標簽
我想要擁有運動和足球標簽的球隊,而不是運動或足球標簽。
我建議嘗試一下:
var teams = (from team in db.Teams
where tags.All(tag => team.Tags.Any(ttag => ttag.TagName == tag))
select team).ToList();
從那里,如果你想要一個名單列表,你可以對它做一個投影(很難完全了解你的數據結構如何設置,但是這樣的事情):
var teamNames = teams.Select(t => t.Name).ToList();
string _tags = "sport,football";
List<string> tags = _tags.Split(',').ToList();
var teams = (from t in db.Tags where tags.All(x=> x.Contains(t.TagName)) select t.Teams).FirstOrDefault().Select(i => i.TeamNames).ToList();
這應該有助於獲得理想的結果
我知道這有點蹩腳,但要讓 EF 核心正常工作,並僅返回集合假設包含所有元素的元素,我必須執行如下操作:
// var query = context....;
foreach (var tag in tags)
{
query = query.Where(p => p.TagList.Any(t => t == tag));
}
return query;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.