c# - 在 C# 中使用 LINQ 时函数求值超时

标签 c# linq

我有以下代码:

var deletedData
    = (from c in this.DataSet.Tables["TableName1"].AsEnumerable()
       from deletedData1 in this.DataSet.Tables["TableName2"].AsEnumerable()
       where (
           (c.Field<string>("ColumnName1")
            == deletedData1.Field<string>("ColumnName2"))
           && (c.Field<string>("ColumnName1") == someString))
       select new
           {
               T1 = c.Field<string>("ColumnName3"),
               T2 = deletedData1.Field<string>("ColumnName4"),
               T3 = c.Field<string>("ColumnName5"),
               T4 = deletedData1.Field<string>("ColumnName6")
           });

当我打开 deletedData 的结果时执行此操作后,它显示函数评估超时。 任何人都可以帮我摆脱这个吗? Table1 有 18000 行,Table2 有 400 行。当我使用 deletedData1 时,我的 UI 挂起。

最佳答案

不要使用 Where 链接 Linq-To-Object 中的表/集合,而是使用 Join:

var deletedData = from c in this.DataSet.Tables["TableName1"].AsEnumerable()
                  let col1 = c.Field<string>("ColumnName1")
                  join deletedData1 in this.DataSet.Tables["TableName2"].AsEnumerable()
                  on col1 equals deletedData1.Field<string>("ColumnName2")
                  where col1 == someString
                  select new
                  {
                       T1 = c.Field<string>("ColumnName3"),
                       T2 = deletedData1.Field<string>("ColumnName4"),
                       T3 = c.Field<string>("ColumnName5"),
                       T4 = deletedData1.Field<string>("ColumnName6")
                  };

Why is LINQ JOIN so much faster than linking with WHERE?

但是,由于这只是一个查询,您应该以某种方式实现它。因此,您可以在 foreach 中使用它或使用 ToList 创建集合。否则你总是在评估它。

关于c# - 在 C# 中使用 LINQ 时函数求值超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19270106/

相关文章:

c# - SqlDataReader 仅返回 SqlCommand 中的第一个选择

LINQ 返回根据嵌套 List<> 中子对象的属性过滤的对象列表

c# - 简单的 LINQ select(使用 Entity Framework)不返回值

c# - 如何将按钮的 Hold/DoubleTap 事件绑定(bind)到 ViewModel 中的属性

c# - 如何将索引字段添加到 Linq 结果

c# - ViewModel 和 Command 之间的通信

c# - MVC 给出了一个奇怪的错误

c# - 使用 Azure Key Vault 签署 CSR

c# - 比 .ToArray() 更好的东西来强制枚举 LINQ 输出

c# - NHibernate 查询只运行一次,然后抛出 InvalidCastException