Linq'join ... into'不会返回连接的对象

时间:2019-05-15 16:20:39

标签: c# linq join linq-to-sql

我是SQL和LINQ的新手。我尝试了一个简单的代码,使用join...into语法将两个列表连接起来,但是结果却出乎我的意料。

public static void Main(string[] args)
{
    IEnumerable<KeyValuePair<char,int>> list1 = new []{ 
        new KeyValuePair<char,int>( 'a', 1) ,
        new KeyValuePair<char,int>( 'b', 2) , 
        new KeyValuePair<char,int>( 'c', 3)  };
    IEnumerable<KeyValuePair<char, int>> list2 =  new[]{
        new KeyValuePair<char,int>( 'b', 10) ,
        new KeyValuePair<char,int>( 'c', 20) ,
        new KeyValuePair<char,int>( 'd', 30)  };

    var joinQuery = from x in list1
                    join y in list2
                    on x.Key equals y.Key into joinTable
                    from t in joinTable
                    select new { element = t };

    foreach (var el in joinQuery)
        Console.WriteLine(el);
}

输出为:

{ element = [b, 10] }
{ element = [c, 20] }

我期望joinTable包含联接记录,例如:

{element = {[b, 2], [b, 10]}}
{element = {[c, 3], [c, 20]}}

您能解释一下... into joinTable这部分实际上做了什么,为什么我可以在最后一次选择中使用x而不能使用y

var joinQuery = from x in list1
                join y in list2
                on x.Key equals y.Key into joinTable
                from t in joinTable
                select new { element = t,
                             first = x,  // OK
                             second = y} // Error: The name y doesn't exist in the current context

2 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您基本上是在尝试从键1匹配的列表1和列表2获取所有信息。如果是这样,您可以这样做:

var joinQuery = from x in list1
                join y in list2
                on x.Key equals y.Key
                select new
                {
                    first = x,
                    second = y
                };

enter image description here

您无需将其添加到任意表中,只需从联接结果中选择即可。

答案 1 :(得分:0)

根据Jon Skeet's blogjoin ... into语法被转换为GroupJoin(),而不是您期望的Join

但是您真正想要的是一个真正的联接,就像这样:

var joinQuery = from x in list1
                join y in list2
                on x.Key equals y.Key                     
                select new { x, y };

在您的查询中,您无法访问y,因为join into的语法不同。您不需要其他from... joinTable,而必须直接访问joinTable

var joinQuery = from x in list1
                join y in list2
                on x.Key equals y.Key into joinTable
                select new {joinTable.x, matches = joinTable.y.ToList()};

但这将导致y具有list2所有匹配的元素。这就是Join(每个匹配元素导致一个“行”)和GroupJoin(匹配项分组在一起)之间的区别。