所以,我正在尝试返回一个人员集合,其ID包含在本地创建的ID集合中(IQueryable)
当我指定“本地创建的集合”时,我的意思是Ids集合不是来自LinqToSql查询,而是以编程方式创建(基于用户输入)。我的查询如下所示:
var qry = from p in DBContext.People
where Ids.Contains(p.ID)
select p.ID;
这导致以下异常......
“不支持使用本地集合的查询”
如何在本地创建的Ids集合中找到包含id的所有人员?
是否可以使用LinqToSql?
如果Ids是List,数组或类似的,则L2S将转换为包含。
如果Ids是IQueryable,只需在查询中使用它之前将其转换为列表。例如。:
List<int> listOfIDs = IDs.ToList();
var query =
from st in dc.SomeTable
where listOfIDs.Contains(st.ID)
select .....
我也在努力解决这个问题。解决了我使用Any()的问题
people.Where(x => ids.Any(id => id == x.ID))
正如上面提到的那样,将类型为IQueryable的ID转换为List或Array将解决问题,这将在SQL中转换为“IN”运算符。但要小心,因为如果ids> = 2100的计数,这将引起另一个问题,即“服务器最多支持2100个参数”,这是您可以在SQL Server中传递给“IN”的最大参数(值)数。
另一种方法是将id保持为IQueryable并使用LINQ“Any”运算符而不是“Contains”,这将在SQL Server中转换为“EXISTS”。
对不起,但这里的答案对我不起作用,因为我正在进行动态类型。
我所做的是在一个效果很好的循环中使用“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));
}