与Linq中的SelectMany混淆

时间:2016-03-24 04:06:00

标签: c# linq

我在查看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子句)?谢谢。

0 个答案:

没有答案