围绕LinqToSQls工作“与本地集合的查询,不支持”异常(Working around Linq

2019-06-25 01:33发布

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

当我指定的“本地创建集”,我的意思是IDS收集处理不当来自LinqToSql查询,并已通过编程创建(根据用户输入)。 我的查询如下所示:

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

这将导致以下异常...

“与当地馆藏查询,不支持”

我怎样才能找到所有的ID,它是包含我的本地创建的ID集合中的人?

是否有可能使用LinqToSql?

Answer 1:

如果IDS是一个列表,阵列或类似的,L2S将转化为一个包含。

如果IDS是一个IQueryable的,只是把它变成一个列表中查询使用它之前。 例如:

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


Answer 2:

我被这个问题也正在努力。 解决我的问题,使用任何()代替

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


Answer 3:

正如上面提到的球员,转换的ID,这是类型的IQueryable到列表或数组将解决这一问题,这将被转换为“IN”操作者在SQL.But要小心,因为如果ID的计数> = 2100这个意愿导致另一个问题是“该服务器最多支持2100个参数”,这是可以传递给“IN”在SQL服务器的参数(值)的最大数量。

另一种方法是保持ID作为IQueryable的使用LINQ“任何”操盘手“包含”,SQL Server中的“存在”,这将被翻译。



Answer 4:

我很抱歉,但答案在这里,因为我再往前做动态类型并没有为我工作。

我所做的就是在一个循环的伟大工程使用“联盟”。 这是如何做:

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));
}


文章来源: Working around LinqToSQls “queries with local collections are not supported” exception