如果您使用实体预测,您会获得IQueryable的好处吗?

时间:2012-07-16 22:05:14

标签: linq entity-framework entity-framework-4 linq-to-entities linq-to-objects

假设我有这样的方法:

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进行过滤。正确?

1 个答案:

答案 0 :(得分:4)

我认为,这是不对的。首先,它不会查询任何内容,因为您只是将IQueryable<T>扩展为新的IQueryable<T>。如果您调用ToList()或导致查询执行的任何其他内容,您将获得异常,因为上下文已在using块的末尾处理。如果不放置上下文,Where过滤器将转换为SQL并在数据库中执行。我相信它的行为方式与您在<{em> Where之前将PropertyA应用于Select 的方式相同。