簡體   English   中英

檢查列表是否包含來自 EntityFramework 中其他列表的項目

[英]Check if list contains item from other list in EntityFramework

我有一個實體 Person ,它有一個與之關聯的位置列表。 我需要查詢人員表並從位置列表(標准)中獲取所有至少有一個位置的表。 以下工作但效率極低:

var searchIds = new List<int>{1,2,3,4,5};
var result = persons.Where(p => p.Locations.Any(l => searchIds.Any(id => l.Id == id)));

這適用於小列表(比如 5-10 個 searchIds 和一個有 5-10 個位置的人。問題是有些人可能有 100 個位置,一次搜索也可以搜索 100 個位置。當我嘗試執行上述操作時EF實際上產生了一個2000+的SQL語句並且失敗了,因為它嵌套太深。雖然嵌套本身已經是一個問題,即使它可以工作,我仍然不會對2000+的SQL語句發生。

注意:真正的代碼還包括多個級別和父子關系,但我確實設法僅使用 id 而不是完整對象將其歸結為這個相當扁平的結構

在 EF 中實現這一目標的最佳方法是什么?

我建議:

var searchIds = new List<int>{1,2,3,4,5};
var result = persons.Where(p => p.Locations.Any(l => searchIds.Contains(l.Id)));

Contains將被翻譯為IN語句。

請記住,id列表會進入sql語句。 如果你的id列表很大,那么你最終會得到一個巨大的查詢。

嘗試切換到聯接而不是執行大量數據包括:

var searchIds = new List<int>{1,2,3,4,5};
var results = (from p in persons
               join l in Location on p.PersonId equals l.PersonId
               where searchIds.Contains(l.Id)
               select p).Distinct().ToList();

顯然,修復此行以匹配您的類和/或連接屬性。

join l in Location on p.PersonId equals l.PersonId

我希望能夠產生更友好的執行計划。

你可以試試這個。

List<EnquirePriceSub> e = getSomethings();
var data = appDb.EnquirePriceSubs.Where(w=> e.Select(s=>s.Id).Contains(w.Id)).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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