高效的LINQ连接查询

本文关键字:查询 连接 LINQ 高效 | 更新日期: 2023-09-27 18:17:54

我在LINQ中执行两个表的连接操作,但它花费了大部分时间来执行小数据集。下面是LINQ查询

 for (int i = 0; i <= 200; i++)
 {
      var test = from r1 in dtRowForNode.AsEnumerable()
                 join r2 in dtFileRowForNode.AsEnumerable()
                 on r1.Field<int>("Lng_Upload_Id") equals r2.Field<int>("Lng_Upload_Id")
                 where ((r1.Field<string>("Txt_Called_Number") == "999") || r1.Field<string>("Txt_Calling_Number") == "888")
                 select r2.Field<string>("Txt_File_Name");
       string[] str = test.Distinct().ToArray();                
}

这里我有两个数据表dtRowForNode,有大约7500行,另一个是dtFileRowForNode,只有12行。

现在我循环这个查询200次,它几乎需要6-7秒来完成for循环。为什么这么小的数据集要花这么多时间。

我应该用不同的方式写这个吗??

高效的LINQ连接查询

看看下面的操作是否对你更快:

var rowForNode=dtRowForNode.AsEnumerable().Select(dt=>new {
  Lng_Upload_Id=dt.Field<int>("Lng_Upload_Id"),
  Txt_Called_Number=dt.Field<string>("Txt_Called_Number"),
  Txt_Calling_Number=dt.Field<string>("Txt_Calling_Number")}).ToList();
var fileRowForNode=dtFileRowForNode.AsEnumberable().Select(dt=>new {
  Lng_Upload_Id=dt.Field<int>("Lng_Upload_Id"),
  Txt_File_Name=dt.Field<string>("Txt_File_Name")}).ToList();
 for (int i = 0; i <= 200; i++)
 {
      var test = from r1 in rowForNode
                 join r2 in fileRowForNode
                 on r1.Lng_Upload_Id equals r2.Lng_Upload_Id
                 where (r1.Txt_Called_Number == "999"
                    || r1.Txt_Calling_Number == "888")
                 select r2.Txt_File_Name;
       string[] str = test.Distinct().ToArray();                
}

数据从哪里进入这两个数据表?? ?如果它来自数据库,那么尝试使用IQueryable或IEnumerable或IList。这样会更快,也可以将LazyLoading选项设置为False。首先将数据放入var或IQueryable或IEnumerable或IList中,然后应用下面的连接查询:

IQueryable<string> testList = (from p in dbContext.test
                             join c in dbContext.test1 on p.testId equals c.test1Id
                             select c.test1);
我希望它能帮助你。:)