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