获取 objects,同时从最新的 child 中获取几个字段

Get objects while getting couple of fields from latest child

我的模型中有两个objects(下面是简化版)

class Author
{
    int ID;
    string Name;
    List<Book> Books;
}

class Book
{
    int ID;
    string Title;
    DateTime PublishDate;
    Author Author;
}

我需要获取所有作者,对于每个作者,我需要最新一本书的 ID 和 PublishDate。

我尝试了以下但没有给我预期的结果:

var authors = db.Authors
    .SelectMany(a => a.Books.OrderByDescending(b => b.PublishDate).DefaultIfEmpty(), (A, B) => new { Author = A, LastBook = B})

我更喜欢 Lambda 表达式(用于学习目的)。

感谢您的帮助。

Select这里很多不是办法。 Select 当您必须将多个集合合并为一个集合时,many 很有用。相反,您只想 select 每个作者的最新一本书,然后导航到最近一本书的作者 ID。

类似于下面的代码应该可以工作。我暂时没有办法测试,可能需要一些修改。

var data = db.Authors
    .Select(author => author.Books.OrderByDescending(book => book.PublishDate).FirstOrDefault())
    .Where(recentBook => recentBook != null)
    .Select(recentBook => new { Author = recentBook.Author, RecentBook = recentBook });

以上查询将排除没有书籍的作者。根据您的数据,您可能不需要空检查。如果作者可以在数据库中但没有任何书籍,则需要进行空检查。如果作者在没有一本书的情况下无法进入数据库,您可以省略带空检查的 where 子句。

要获取所有作者而不考虑最近出版的书,您可以改用此查询。

var data = db.Authors
    .Select(author => new { Author = author, RecentBook = author.Books.OrderByDescending(book => book.PublishDate).FirstOrDefault() });