获取对象,同时从最近的子对象中获取几个字段



我的模型中有两个对象(下面是简化版本(

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

我需要得到所有的作者,对于每个作者,我需要最近一本书的ID和出版日期。

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

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

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

谢谢你的帮助。

选择多个不是方法。当您必须将多个集合合并到一个集合中时,选择多个非常有用。相反,您只想为每个作者选择最新的书,然后导航到该新书的作者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 });

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

若要获取所有作者,而不考虑最近的一本书,可以使用此查询。

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

最新更新