簡體   English   中英

linq 其中包含列表中的所有項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM