我正在制作一个 ASP.NET C# 库系统。获取 (MSSQL) 数据库设计的屏幕截图:
为了显示书籍,我使用了 Rentals 表。 但是我的问题:
- 我将 Books 表与 Rentals 表合并在一起(因为还需要显示尚未租过一次的书(请参阅 id 为 3 的书)
- 当我刚做 left join 时,我在 books-overview 中多次看到我的书 offcourse...
- SO:我应该需要一个 LINQ 查询,将 Books 与 Rentals 结合起来,但如果这些书已经被多次出租,他应该只加入 >该 book_id 表中的最后一个值
- 看下图:查询应该只选择绿色选择的值...
- (额外信息:如果有人租了一本书,返回值=0,如果他还书,它就变成1)
我现在的查询是:
var query = (from b in db.Books
join a in db.Authors on b.author_id equals a.author_id
join c in db.Categories on b.category_id equals c.category_id
join r in db.Rentals on b.book_id equals r.book_id into lf
from r in lf.DefaultIfEmpty()
select new BookDetails(
b.book_id,
b.title,
b.ISBN,
b.description,
b.author_id,
a.firstName,
a.lastName,
b.category_id,
r.returned == null ? 1 : r.returned)
).ToList();
但是就像我说的,这会多次显示我租借的书...... 我一直在考虑具有“MAX”属性的东西? (但这适用于 linq 吗?)
最佳答案
您可以按图书 ID 对图书进行分组,然后从每组中选择第一项。这是一种模拟“不同”的巧妙方法。在你的情况下是
var query = (from b in db.Books
join a in db.Authors on b.author_id equals a.author_id
join c in db.Categories on b.category_id equals c.category_id
join r in db.Rentals on b.book_id equals r.book_id into lf
from r in lf.DefaultIfEmpty()
group new{ Book = b, Author = a, Rental = r }
by b.book_id into booksById
let item = booksById.First()
select new BookDetails(
item.Book.book_id,
item.Book.title,
item.Book.ISBN,
item.Book.description,
item.Book.author_id,
item.Author.firstName,
item.Author.lastName,
item.Book.category_id,
item.Rental.returned == null
? 1 : item.Rental.returned))
.ToList();
关于c# - LINQ 查询仅加入最后一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20288521/