鉴于以下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滴答
这些结果令我感到惊讶。任何人都可以解释一下吗?
答案 0 :(得分:1)
q2
和q3
是相同的,它只是编译器允许的不同语法。 q2
被称为query syntax q3
被称为Method Syntax。编译器会自动将q2
转换为q3
。
q1
是交叉加入,q2
和q3
是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();