EF自定义选择器表达式
本文关键字:表达式 选择器 自定义 EF | 更新日期: 2023-09-27 18:12:07
我有以下简单的场景。我有一个Customer类,它在我的edmx中定义。我也有一个Order类,一个Customer可以通过它的Orders属性拥有零个或多个Orders。
我在Customer类中定义了一个OrderCount属性,像这样:
public partial class Customer
{
public int OrderCount { get; set; }
}
我想轻松地编写Select查询,它适当地加载这个OrderCount的值。我尝试在Customer类中这样做:
public partial class Customer
{
public int OrderCount { get; set; }
public static Expression<Func<Customer, Customer>> DetailSelector = c =>
{
c.OrderCount = c.Orders.Count;
return c;
};
}
然后选择查询:
var customersWithOrderCount = ctx.Customers.Select(Customer.DetailSelector);
然而,这样我得到一个错误,带语句体的lambda不能转换为表达式。然后我试着这样做:
public partial class Customer
{
public int OrderCount { get; set; }
public static Expression<Func<Customer, Customer>> DetailSelector = c => Customer.LoadDetail(c);
public static Customer LoadDetail(Customer customer)
{
customer.OrderCount = customer.Orders.Count;
return customer;
}
}
但是这样当我执行Select查询时,我得到以下异常:
LINQ to Entities does not recognize the method 'Customer LoadDetail(Customer)' method, and this method cannot be translated into a store expression.
最简单的方法是什么?
更新:只是为了澄清,我特别寻找一种方法来做到这一点与表达式。所以我不想从数据库加载订单,我只想填充OrderCount属性。谢谢你,
这有点简单,但我认为在实体上保持基本的工作设计。我个人认为最好的方法是使用。order . count。如果你把它从那里拉出来,为什么不保持在那里呢?
如果要编写select查询,请包含Customers中的值。直接下订单,将为您生成适当的SQL。否则,我个人会在加载客户后立即在CustomerRepository类中设置这个值。然后你总是从一个地方获得你的客户,你知道它的集合(当然意味着使用存储库模式)