EF加载部分相关的收集

本文关键字:加载部 EF | 更新日期: 2023-09-27 18:14:47

我想要实现的是返回一个类别(JSON)列表,其中包含最新(Top 1)修改的产品。

假设我有一个Product &类别类。

Class Category{
   public string Name {get;set;}
   public ICollection<Product> Products {get;set;}
   public Product FirstProduct { get { return          Products.OrderByDescending(p=>p.Modified).FirstOrDefault;}

和执行以下操作的MVC api控制器

....
return db.Categories.Include(p=>p.Products.OrderByDescending(m=>m.Modified).Take(1).FirstOrDefault());
.....

但这似乎不起作用…

预期的结果是这样的(我实际上只需要Name和FirstProduct列):
[
{Name : "Category1", FirstProduct : {Name : "Product1"}, Products : [{Name: "Product1}]
{Name : "Category2", FirstProduct : {Name : "Product1"}, Products : [{Name: "Product1}]
{Name : "Category3", FirstProduct : {Name : "Product1"}, Products : [{Name: "Product1}]
]

EF加载部分相关的收集

投影可能是一个解决方案:

IEnumerable<Category> categories = db.Categories
    .Select(c => new
    {
        Category = c,
        FirstProduct = c.Products
            .OrderByDescending(p => p.Modified)
            .FirstOrDefault()
    })
    .AsEnumerable()
    .Select(x => x.Category);

如果你不需要所有的属性,你可以只投影需要的属性,例如,代替Category = c,你将使用CategoryName = c.Name或在OrderByDescendingFirstOrDefault之间添加一个Select来投影Product的属性。