c# - IQueryable对象的foreach循环问题

标签 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 的值时,我都会得到错误的输出。

最佳答案

您面临的问题是延迟执行,您应该能够找到很多这方面的信息,但基本上没有任何代码正在执行,直到您真正尝试从 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 之前不应更改该变量。

关于c# - IQueryable对象的foreach循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2963583/

相关文章:

c# - 在字符串中查找特定数字

c# - 按类型名称获取 GUID

C# 停止按钮在单击时获得焦点

sql - 为什么 Linq To Sql 数据绑定(bind)到 gridview 比传递 SQL 慢得多?

Linq to SQL 在外部构造自定义对象

sql-server-2008 - 为什么Linq2SQL生成嵌套查询而不是使用JOIN?

c# - Notepad++ .NET 插件 - 获取当前缓冲区文本 - 编码问题

C# 名称值集合 : Should we check if key exists before we remove those?

c# - 在 Accord.net 框架中使用 Liblinear 进行多重分类

c# - 在具有接口(interface)的 LINQ to Sql 数据上下文上使用删除 - 'Interface is not mapped as a table'