我有以下简单的场景。我有一个Customer类,它在我的edmx中定义。我也有一个Order类,客户可以通过其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无法转换为Expression。 然后我试着这样做:
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.
最简单的方法是什么?
更新:为了澄清,我特意寻找一种方法来表达。所以我不想从数据库加载Orders,我只想填写OrderCount属性。 谢谢,
答案 0 :(得分:0)
这有点过于简单,但我认为在实体上保持基本的工作设计。恕我直言的最佳方式.Order.Count。如果你从那里拉它,为什么不把它放在那里?
如果要编写选择查询,请直接包含Customers.Orders中的值,并为您生成正确的SQL。否则,我会在加载客户后立即将此值包含在CustomerRepository类中。然后,您总是从一个地方获得您的客户,并且您知道它的集合(当然意味着使用存储库模式)