解决LinqToSQls"不支持使用本地集合的查询"例外

ias*_*ons 36 collections linq-to-sql

所以,我正在尝试返回一个人员集合,其ID包含在本地创建的ID集合中(IQueryable)

当我指定"本地创建的集合"时,我的意思是Ids集合不是来自LinqToSql查询,而是以编程方式创建(基于用户输入).我的查询如下所示:

var qry = from p in DBContext.People
                  where Ids.Contains(p.ID)
                  select p.ID;
Run Code Online (Sandbox Code Playgroud)

这导致以下异常......

"不支持使用本地集合的查询"

如何在本地创建的Ids集合中找到包含id的所有人员?

是否可以使用LinqToSql?

Kri*_*erA 36

如果Ids是List,数组或类似的,则L2S将转换为包含.

如果Ids是IQueryable,只需在查询中使用它之前将其转换为列表.例如:

List<int> listOfIDs = IDs.ToList();  
var query =  
from st in dc.SomeTable  
where listOfIDs.Contains(st.ID)
select .....
Run Code Online (Sandbox Code Playgroud)

  • 尽早解决你的IQueryables会导致一些严重的性能下降.首先尝试使用Any()而不是Contains(). (4认同)
  • 我认为你的问题的解决方案比这个答案更细致.我成功地使用了相同的构造(WHERE子句中的IQueryable上的Contains方法),LINQ to SQL将它转换为SQL查询中的WHERE EXISTS子句.它似乎在某些情况下工作而不是其他情况,所以你应该发布你如何获得你的Ids IQueryable,因为这可能会对这个问题有所了解. (2认同)
  • 我想我看到你在说什么: - 传递List/Array /等.没问题b/c它会生成一个WHERE ... IN子句. - 传递延迟的IQueryable是正常的b/c它将与当前的延迟查询集成. - 传递一个本地的IEnumerable不行,但你可以.ToList()它就可以了. (2认同)

max*_*ego 31

我也在努力解决这个问题.解决了我使用Any()的问题

people.Where(x => ids.Any(id => id == x.ID))
Run Code Online (Sandbox Code Playgroud)