假设我有一个这样的方法:
IQueryable<MyFlatObject> GetMyFlatObjects()
{
using (var context = new MyEntities())
{
return context.MyEntities.Select(x => new MyFlatObject()
{
Property1 = x.PropertyA,
Property2 = x.PropertyB,
Property3 = x.PropertyC,
});
}
}
现在如果我打电话:
MyService.GetMyFlatObjects().Where(x => x.Property1 == "test");
卫生检查。这个过滤器不会传播到我的数据库存储(就像我刚刚查询了实体一样),但我会返回所有结果,并使用LINQ对对象进行过滤。正确的
我认为这是不对的。首先,它不查询任何内容,因为您只是将一个IQueryable<T>
扩展到一个新的IQueryable<T>
。如果您调用ToList()
或任何其他导致查询执行的操作,您将得到一个异常,因为上下文已经在using
块的末尾被释放。如果不处理上下文,Where
过滤器将被转换为SQL并在数据库中执行。我相信它的行为方式与您在Select
之前将Where
应用于PropertyA
相同。