Linq 'join ... into' не возвращает присоединенные объекты - PullRequest
1 голос
/ 15 мая 2019

Я новичок в 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 голосов
/ 15 мая 2019

Согласно блогу Джона Скита синтаксис join ... 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 (с совпадениями, сгруппированными вместе).

0 голосов
/ 15 мая 2019

Если я правильно понимаю, вы в основном пытаетесь получить всю информацию из списка 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

Вам не нужно добавлять это в произвольную таблицу, просто выберите из результатовобъединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...