【问题标题】:Function Evaluation is timed out while using LINQ in c#在 c# 中使用 LINQ 时函数评估超时
【发布时间】:2013-10-09 19:18:54
【问题描述】:

我有以下代码:

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 挂起。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    不要使用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 创建一个集合。否则你总是在评估它。

    【讨论】:

    • 非常感谢答案。为什么我们不应该使用 where 来链接表。上面的 LINQ 中的“让”是什么意思..
    • @user2862430:let 允许您将变量存储在查询中,以便您以后可以重用它。这增加了可读性和性能(在 Linq-To-Objects 中)。您也可以重复相同的操作(就像您对 c.Field&lt;string&gt;("ColumnName1") 所做的那样)。
    • ThanQ 这么多..它工作正常..我希望你证明上述解决方案的合理性。
    • 为什么不使用 where 将 linq 中的表链接到对象
    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多