如何在 LINQ 内部连接后将相同的结果合并为一行

How to combine same result into one row after inner join in LINQ

我是 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});

然后我创建用于显示结果的 viewModel,viewModel 代码如下所示

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() 方法就像 SQL 中的 Inner Join 一样,查询结果是这样的

| 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           |

当作者值在书本 ID 上具有相同值时,如何将作者值连接到同一行?有什么LINQ方法可以结合吗?

您可以按图书和出版商对查询进行分组,并使用 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))
    });