Iqueyable对象的Foreach循环问题

时间:2010-06-03 05:49:30

标签: c# linq-to-sql

我们可以为Iqueryable对象使用foreach循环吗?

我想做点如下的事情:

query = Iqueryable<Myclass> = objDataContext.Myclass; // objDataContext is an object of LINQ datacontext class

int[] arr1 = new int[] { 3, 4, 5 };

foreach (int i in arr1)
{
query = query.Where(q => (q.f_id1 == i || q.f_id2 == i || q.f_id3 == i));
}

如果i被更改,它会给我错误的输出作为每个时间值。

3 个答案:

答案 0 :(得分:3)

您面临的问题是延迟执行,您应该能够找到很多关于此的信息,但基本上没有任何代码被执行,直到您实际尝试从IQueryable读取数据(将其转换为IEnumerable)或列表或其他类似的操作)。这意味着当i设置为最终值时,这一切都在foreach结束后发生。

如果我没记错,你可以做的一件事就是在for循环中初始化一个新的变量,如下所示:

foreach (int i in arr1)
{
   int tmp = i;
   query = query.Where(q => (q.f_id1 == tmp || q.f_id2 == tmp || q.f_id3 == tmp));
}

通过将其放入每个循环重新创建的新变量中,在执行IQueryable之前不应更改变量。

答案 1 :(得分:1)

你不需要每个人,试试这样:

query = objDataContext.Myclass.Where(q => (arr1.Contains(q.f_id1) || arr1.Contains(q.f_id2) || arr1.Contains(q.f_id3));

答案 2 :(得分:0)

这是因为“i”在您真正使用迭代查询集合时才会被评估,而不是那时我相信“i”将是最后一次。