EF无法获取实体导航属性的引用实体

本文关键字:实体 属性 引用 导航 EF 获取 | 更新日期: 2023-09-27 18:09:12

这是我的模型类

public class Serve
{
    public int Id { get; set; }
    public Table Table { get; set; }
    public bool IsFinished { get; set; }
    public decimal TotalMoney { get; set; }
    public virtual ICollection<Order> Orders { get; set; }
}
public class Order
{
    public int Id { get; set; }
    public Item Item { get; set; }
    public int Numbers { get; set; }
    public bool IsCheifReceived { get; set; }
    public bool IsCheifCooked { get; set; }
    public Serve Serve { get; set; }
    public Order()
    {
        IsCheifCooked = IsCheifReceived = false;
    }
}
public class Item
{
    public int Id { get; set; }    
    public string Name { get; set; }    
    public string Unit { get; set; }
    public decimal Price { get; set; }    
    public Category Category { get; set; }    
    public bool IsNeedToNotifyChief { get; set; }
}

我想计算按同一项(这是餐厅的菜单项)分组的订单数量和总金额。

这是LINQ查询。

var serving = db.Serves
                    .Where(m => m.Table.Id == table.Id)
                    .Where(m => m.IsFinished == false)
                    .OrderByDescending(m => m.Id)
                    .FirstOrDefault();
var groupedOrder = serving.Orders
                        .OrderByDescending(m => m.Id)
                        .GroupBy(m => m.Item)
                        .Select(g => new
                        {
                            Item = g.Key,
                            Numbers = g.Sum(ri => ri.Numbers)
                        }).ToList();

但是在这种情况下,在.GroupBy(m => m.Item)m.Itemnull,并且它将所有的order归为一组。(我知道问题是m.Item未在此查询中加载)

在这里,我不知道如何使m.Item在这个LINQ查询中加载。请帮我做这件事。

注::我使用实体框架6

EF无法获取实体导航属性的引用实体

我认为变量服务是一些对象的列表,而不是查询。如果我是对的,你应该包括项目当你得到服务从DB。它将看起来像下面的代码:

var serving = db.Serves
                 .Include(x => x.Orders)
                 .Include(x => x.Orders.Select(x => x.Item)) //here you'll get your items
                 .Where(m => m.Table.Id == ta && m.IsFinished == false)
                 .OrderByDescending(m => m.Id)
                 .FirstOfDefault();
//and after that your code should work correctly
if(serving != null) //don't forget check it, if you use FirstOfDefault()
{
   var groupedOrder = serving.Orders
            .OrderByDescending(m => m.Id)
            .GroupBy(m => m.Item) 
            .Select(g => new
            {
                Item = g.Key,
                Numbers = g.Sum(ri => ri.Numbers)
            }).ToList();
}