我在查看this post后尝试使用Join和SelectMany,并且能够使用SelectMany生成交叉连接(谢谢SO)。我编写了两个版本的SelectMany,它们产生相同的结果。
public class Program
{
public static void Main(string[] args)
{
IEnumerable<TableA> aTable = new List<TableA>(){
new TableA{OriginalPhoneNumber= "abc", DestinationPhoneNumber = "123"},
new TableA{OriginalPhoneNumber= "xyz", DestinationPhoneNumber = "345"},
new TableA{OriginalPhoneNumber= "lmo", DestinationPhoneNumber = "456"}
};
IEnumerable<TableB> bTable = new List<TableB>() {
new TableB{ID="abc"},
new TableB{ID="345"},
new TableB{ID="zzz"}
};
Console.WriteLine("First Query");
var results1 = aTable.SelectMany(TA => bTable.Where(b => b.ID == TA.OriginalPhoneNumber || b.ID == TA.DestinationPhoneNumber),
(TA, TB) => new { TA, TB });
foreach (var item in results1)
{
Console.WriteLine(item.TA.OriginalPhoneNumber + " " + item.TA.DestinationPhoneNumber + " " + item.TB.ID);
}
Console.WriteLine("Second Query");
var results2 = aTable.SelectMany(TA => bTable, (TA, TB) => new { TA, TB })
.Where(ab => ab.TB.ID == ab.TA.DestinationPhoneNumber || ab.TB.ID == ab.TA.OriginalPhoneNumber);
foreach (var item in results2)
{
Console.WriteLine(item.TA.OriginalPhoneNumber + " " + item.TA.DestinationPhoneNumber + " " + item.TB.ID);
}
Console.ReadKey();
}
}
public class TableA
{
public string OriginalPhoneNumber;
public string DestinationPhoneNumber;
}
public class TableB
{
public string ID;
}
第二个查询(如果针对数据库运行,EF / Linq2Sql)将产生交叉连接,然后使用where子句过滤结果。第一个linq表达式是否会生成相同的sql查询或使用内部联接生成查询(基于where子句)?谢谢。