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