假设我有这样的方法:
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-to-objects进行过滤。正确?
答案 0 :(得分:4)
我认为,这是不对的。首先,它不会查询任何内容,因为您只是将IQueryable<T>
扩展为新的IQueryable<T>
。如果您调用ToList()
或导致查询执行的任何其他内容,您将获得异常,因为上下文已在using
块的末尾处理。如果不放置上下文,Where
过滤器将转换为SQL并在数据库中执行。我相信它的行为方式与您在<{em> Where
之前将PropertyA
应用于Select
的方式相同。