获取 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() });
我的模型中有两个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() });