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

C# 连接两个数据集的最佳方法,c#,linq,lambda,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

给定以下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();
为了好玩,我将查询分为三个单元测试。我添加了一个秒表来计时每个测试的执行。代码发布后,每个测试都会产生以下结果

问题1:已用时间:2500个滴答声

问题2:已用时间:11381次

问题3:运行时间:2406个滴答声


这些结果令我惊讶。有人能解释一下吗?

q2
q3
是相同的,只是编译器允许使用不同的语法<调用代码>q2调用代码>q3。编译器自动将
q2
转换为
q3

q1
是交叉连接,
q2
q3
是内部连接。您应该使用
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();

交叉连接的性能是否比内部连接差。唯一的区别是可读性吗?@DarthPaper更糟糕。笛卡尔积,你知道。