2013-06-12 48 views
1

我在LINQ中为两个表执行连接操作,但大部分时间都是为小数据集执行。以下是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();     
} 

在这里,我有两个DataTable dtRowForNode有7500左右行和另一种是dtFileRowForNode一个只有12行。现在

我去为这个循环查询200次,花费近6-7秒即可完成for循环。为什么它要花这么多时间来处理这么小的数据集。

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

+1

你真的需要的'AsEnumerable()'? –

+0

@MthetheWWatson我无法得到你的观点先生! –

+0

AsEnumerable()遍历每个项目并将其添加到Enumerable变量 –

回答

1

看看以下运行为您带来任何更快:

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();     
} 
+0

相同的结果。性能没有变化! –

+0

然后有些事情是奇怪的,因为我只是运行了相同的测试,一些虚拟数据在第一个表中有7718条记录,第二条记录中有12条记录,整个事情需要0.046秒。 –

+0

我刚刚在变量创建中添加了一个.ToList(),以确保LINQ不会在每个循环中重新创建它们。我的测试数据实际上并不在数据表中,我直接创建了外部变量。这可能是不同之处。 –

0

从哪里数据进入这两个数据表。如果它来自数据库,则尝试使用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); 

我希望这会帮助你。 :)