2014-02-09 105 views
4

我有一個EF6查詢需要的標識列表,並做了查詢:LINQ實體框架6大。任何()

public IList<Audit> AuditsByIDs(List<int> ids) 
{ 
    return _db.Audits 
     .Include(p => p.User) 
     .Where(p => ids.Any(i => i == p.Id)).ToList(); 
} 

它的工作原理爲少數IDS的,但是當到達數百我得到的錯誤:

Some part of your SQL statement is nested too deeply. Rewrite the query or break it up into smaller queries.

如何獲得查詢返回才把IDS傳入?我不能改變數據庫:(

+0

我會用相交,如果有可能,但它不似乎沒有:(你能告訴我們生成的SQL嗎? –

+0

對於正在通過ID進行搜索的大型數據結構,您希望使用一些索引結構,如HashSet 或字典,將會更快。 –

+0

@ Some1Pr0否,它不會,它是LINQ to Ent它不管怎麼說都會被轉換成IN(item1,item2,...)'作爲SQL查詢的一部分。 – MarcinJuraszek

回答

8

使用Contains代替:

public IList<Audit> AuditsByIDs(List<int> ids) 
{ 
    return _db.Audits 
     .Include(p => p.User) 
     .Where(p => ids.Contains(p.Id)).ToList(); 
} 

哪些應該生成的SQL查詢中被轉化爲IN

+0

在大單上完美工作。當我被允許時,我會在幾分鐘內標記爲接受。 –

+1

列表大小無關緊要。在這種情況下,無論列表有多大,您都應該使用「Contains」而不是「Any」。它只是更好,因爲生成的SQL更好。 – MarcinJuraszek

+0

它就像一個魅力! –