在使用LINQ进行C#编程时,函数评估超时。

3

I have the following code:

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会挂起。
1个回答

2
不要在 Linq-To-Object 中使用 Where 来连接表/集合,应该使用 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")
                  };

为什么使用LINQ JOIN比WHERE连接快那么多?

然而,由于这只是一个查询,您应该以某种方式将其具体化。因此,您可以使用foreach消耗它或使用ToList创建集合。否则,您将始终在评估它。


非常感谢您的回答。为什么我们不应该使用where来连接表?在上面的LINQ中,'let'是什么意思? - Vinod kumar
@user2862430:let关键字允许你在查询中存储一个变量,以便稍后重用。这提高了可读性和性能(在Linq-To-Objects中)。你也可以像使用c.Field<string>("ColumnName1")一样重复使用它。 - Tim Schmelter
非常感谢,它工作得很好。我希望你能为上述解决方案进行证明。 - Vinod kumar
为什么我们不在 LINQ to Object 中使用 where 来链接表格? - Vinod kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接