Как объединить один и тот же результат в один ряд после внутреннего объединения в LINQ - PullRequest
0 голосов
/ 15 октября 2019

Я новичок в ASP.NET и LINQ. Я хочу отобразить название книги, имя издателя и имя автора на странице указателя. Одна книга может иметь более одного автора.

Мой запрос на отображение результата выглядит следующим образом

var query = BookAuthors.Join(Authors,
            bookAuthor => bookAuthor.AuthorId,
            author => author.Id,
            (bookAuthor, author) => new { bookAuthor = bookAuthor, AuthorName = author.Name })
                .Join(Books,
                ba => ba.bookAuthor.BookId,
                book => book.Id,
                (ba, book) => new { book = book, AuthorName = ba.AuthorName })
                    .Join(Publishers, 
                    book => book.book.PublisherId,
                    publisher => publisher.Id,
                    (book, publisher) => new { BookId = book.book.Id , BookName = book.book.Name, AuthorName = book.AuthorName,  PublisherName = publisher.Name});

Затем я создаю модель представления для отображения результата, код представления модели выглядит так

foreach (var obj in query)
        {

            viewModel.Add(new TestViewModel
            {
                BookId = obj.BookId,
                BookName = obj.BookName,
                AuthorName = obj.AuthorName,
                PublisherName = obj.PublisherName
            });
        }
        return View(viewModel);

используя метод Join (), он работает как Inner Join в SQL, результат запроса будет таким:

| BookName | PublisherName | Author             |


| Book A   | Publisher B   | Author A           |

| Book B   | Publisher A   | Author A           |

| Book B   | Publisher A   | Author B           |

| Book C   | Publisher B   | Author C           |

Но я ожидаю, что результат запроса будет таким

| BookName | PublisherName | Author             |


| Book A   | Publisher B   | Author A           |

| Book B   | Publisher A   | Author A, Author B |

| Book C   | Publisher B   | Author C           |

Как присоединить значение автора к той же строке, если оно имеет одинаковое значение для идентификатора книги? Есть ли какой-нибудь метод LINQ для его объединения?

1 Ответ

1 голос
/ 15 октября 2019

Вы можете сгруппировать свой запрос по книге и издателю и использовать string.Join, чтобы объединить имя автора

var result = query.GroupBy(x => new
    {
        x.BookName,
        x.PublisherName
    })
    .Select(x => new
    {
        x.Key.BookName,
        x.Key.PublisherName,
        AuthorName = string.Join(", ", x.Select(y => y.AuthorName))
    });
...