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属性。谢谢你,

EF自定义选择器表达式

这有点简单,但我认为在实体上保持基本的工作设计。我个人认为最好的方法是使用。order . count。如果你把它从那里拉出来,为什么不保持在那里呢?

如果要编写select查询,请包含Customers中的值。直接下订单,将为您生成适当的SQL。否则,我个人会在加载客户后立即在CustomerRepository类中设置这个值。然后你总是从一个地方获得你的客户,你知道它的集合(当然意味着使用存储库模式)