您好我正在使用实体框架4,我正在尝试查询客户及其订单 作为导航属性,但我只想加载特定日期的订单。
使用时:
List<Customer> CustomerResults = ctx.Customers
.Include("Orders")
.Where(
c =>
c.Orders.Any(od =>(od.DateTimeIn >= this.StartDateComboBox.DateTime &&
od.DateTimeIn <= this.EndDateComboBox.DateTime))
);
如果任何订单符合标准,我会收到所有订单。
是否可以过滤导航属性以仅返回符合特定条件的行?
答案 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表达式做到这一点,但我不记得语法。