Linq 如果您使用实体投影,您会获得IQueryable的好处吗?

Linq 如果您使用实体投影,您会获得IQueryable的好处吗?,linq,entity-framework,entity-framework-4,linq-to-entities,linq-to-objects,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() {

假设我有这样一种方法:

IQueryable<MyFlatObject> GetMyFlatObjects()
{
    using (var context = new MyEntities())
    {
        return context.MyEntities.Select(x => new MyFlatObject()
                                                  {
                                                     Property1 = x.PropertyA,
                                                     Property2 = x.PropertyB,
                                                     Property3 = x.PropertyC,
                                                  });
    }
}

精神检查。这个过滤器不会像我刚刚查询实体一样传播到我的数据库存储区,而是会返回所有结果,并使用LINQ to对象进行过滤。是吗?

我想,这是不对的。首先,它不会查询任何内容,因为您只是将IQueryable扩展到新的IQueryable。如果调用ToList或其他任何导致查询执行的操作,您将得到一个异常,因为上下文已经在using块末尾被释放。如果不处理上下文,则Where筛选器将转换为SQL并在数据库中执行。我相信它的行为方式与在选择之前应用Where to PropertyA的方式相同。

我认为,这是不对的。首先,它不会查询任何内容,因为您只是将IQueryable扩展到新的IQueryable。如果调用ToList或其他任何导致查询执行的操作,您将得到一个异常,因为上下文已经在using块末尾被释放。如果不处理上下文,则Where筛选器将转换为SQL并在数据库中执行。我相信它的行为方式与您在选择之前应用Where to PropertyA的方式相同。

对,我在发布时没有考虑上下文的处理。在幕后,我实际上是在使用存储库抽象。如果这确实传递了过滤器并正确地将其映射到原始实体属性,那将非常好。我很惊讶我找不到太多关于这个的信息。@AdamD:你应该测试一下,我不是100%确定。但是如果我没记错的话,我在一段时间前问过自己这样一个查询会发生什么,我测试了它,得出了上面的结论。Select返回一个IQueryable,它仍然保存一个SQL提供程序引用和一个连接,因此它仍然是实体的LINQ,而不是对象的LINQ。好的,只是检查了SQL profiler来测试它。它的工作原理与您所想的一样,并正确地将实体属性映射到sql查询中。我还检查了一个计算属性,即MyFlatObject.Property2=MyEntity.PropertyA+MyEntity.PropertyB,它甚至将其正确映射到sql。非常令人印象深刻。是的,我在发帖时没有考虑到上下文被处理。在幕后,我实际上是在使用存储库抽象。如果这确实传递了过滤器并正确地将其映射到原始实体属性,那将非常好。我很惊讶我找不到太多关于这个的信息。@AdamD:你应该测试一下,我不是100%确定。但是如果我没记错的话,我在一段时间前问过自己这样一个查询会发生什么,我测试了它,得出了上面的结论。Select返回一个IQueryable,它仍然保存一个SQL提供程序引用和一个连接,因此它仍然是实体的LINQ,而不是对象的LINQ。好的,只是检查了SQL profiler来测试它。它的工作原理与您所想的一样,并正确地将实体属性映射到sql查询中。我还检查了一个计算属性,即MyFlatObject.Property2=MyEntity.PropertyA+MyEntity.PropertyB,它甚至将其正确映射到sql。非常令人印象深刻。
MyService.GetMyFlatObjects().Where(x => x.Property1 == "test");