2014-02-09 69 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

它就像一个魅力! –