我是否可以使用“.Include”在Entity Framework 4中加载分层数据,并根据某些条件过滤导航属性

时间:2011-01-19 09:34:04

标签: c# linq entity-framework-4 hierarchical-data

您好我正在使用实体框架4,我正在尝试查询客户及其订单 作为导航属性,但我只想加载特定日期的订单。

使用时:

List<Customer> CustomerResults = ctx.Customers
.Include("Orders") 
.Where(
       c =>
       c.Orders.Any(od =>(od.DateTimeIn >= this.StartDateComboBox.DateTime && 
       od.DateTimeIn <= this.EndDateComboBox.DateTime))
      );

如果任何订单符合标准,我会收到所有订单。

是否可以过滤导航属性以仅返回符合特定条件的行?

1 个答案:

答案 0 :(得分:7)

不,没有。

简而言之,使用Include进行急切加载会自动加载所有相关记录(想想没有过滤器的LEFT OUTER JOIN)。

如果您想要过滤相关记录,请不要使用Include - 使用匿名类型投影,EF只会“计算”需要检索的内容:

var CustomerResults = ctx.Customers 
                         .Select(x => new
                         {
                            Customer = x,
                            Orders = x.Orders.Where(y => y.DateTimeIn > value)
                         }).ToList();

如果您想要返回Customer实体,那么只需在结尾处进行其他投影,只需确保首先实现查询(.ToList())。

编辑 - 要放回客户对象,例如:

var Customers = new List<Customer>();
foreach (var anonType in CustomerResults)
{
   Customer c = anonType.Customer;
   c.Orders = anonType.Orders;
   Customers.Add(c);
}

我确信你可以用LINQ表达式做到这一点,但我不记得语法。