在c#中使用LINQ时功能评估超时

时间:2013-10-09 10:56:31

标签: 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时,我的用户界面就悬空了。

1 个答案:

答案 0 :(得分:2)

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