连接两个数据集的最佳方法

时间:2016-05-27 14:21:03

标签: c# linq lambda

鉴于以下linq和lambda表达式,连接具有多个连接条件的两个数据集的最佳方法是什么?所有查询都会产生相同的结果。

var q1 = (from t1 in table1
     from y in table2
     where t1.ColumnName == y.ColumnName
     && t1.ColumnName2 == y.ColumnName2
     select t1).ToList();

var q2 = (from t1 in table1
     join y in table2 on new { Key1 = t1.ColumnName, Key2 = t1.ColumnName2 }
     equals new { Key1 = y.ColumnName, Key2 = y.ColumnName2 }
     select t1).ToList();

var q3 = table1.Join(table2,
     t1 => new { Key1 = t1.ColumnName, Key2 = t1.ColumnName2 },
     y => new { Key1 = y.ColumnName, Key2 = y.ColumnName2 },
     (t1, y) => new { t1 }).ToList();

为了好玩,我将查询分成了三个单元测试。我添加了一个秒表来计算每次测试的执行时间。使用发布中的代码,每个测试都会产生以下结果

Q1:经过:2500滴答

Q2:经过:11381滴答

Q3:经过:2406滴答

这些结果令我感到惊讶。任何人都可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

q2q3是相同的,它只是编译器允许的不同语法。 q2被称为query syntax q3被称为Method Syntax。编译器会自动将q2转换为q3

q1是交叉加入,q2q3是INNER联接。您应该使用q2以提高可读性。

顺便说一句,您可以将q3替换为:

var q3 = table1.Join(table2,
         t1 => new { Key1 = t1.ColumnName, Key2 = t1.ColumnName2 },
         y => new { Key1 = y.ColumnName, Key2 = y.ColumnName2 },
         (t1, y) => new { t1 }).ToList();