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

问题描述 投票:36回答:4

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

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

var qry = from p in DBContext.People
                  where Ids.Contains(p.ID)
                  select p.ID;

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

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

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

是否可以使用LinqToSql?

linq-to-sql collections
4个回答
36
投票

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

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

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

30
投票

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

people.Where(x => ids.Any(id => id == x.ID))

1
投票

正如上面提到的那样,将类型为IQueryable的ID转换为List或Array将解决问题,这将在SQL中转换为“IN”运算符。但要小心,因为如果ids> = 2100的计数,这将引起另一个问题,即“服务器最多支持2100个参数”,这是您可以在SQL Server中传递给“IN”的最大参数(值)数。

另一种方法是将id保持为IQueryable并使用LINQ“Any”运算符而不是“Contains”,这将在SQL Server中转换为“EXISTS”。


0
投票

对不起,但这里的答案对我不起作用,因为我正在进行动态类型。

我所做的是在一个效果很好的循环中使用“UNION”。这是如何做:

var firstID = cityList.First().id;
var cities = dc.zs_Cities.Where(c => c.id == firstID);
foreach(var c in cityList)
{
  var tempCity = c;
  cities = cities.Union(dc.zs_Cities.Where(cty => cty.id == tempCity.id));
}
© www.soinside.com 2019 - 2024. All rights reserved.