【问题标题】:Will you get the benefits of IQueryable if you use entity projections?如果您使用实体投影,您会获得 IQueryable 的好处吗?
【发布时间】:2012-07-16 22:05:13
【问题描述】:

假设我有这样的方法:

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 进行过滤。对吧?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的,我发帖时没有考虑上下文被处理。在幕后,我真的在使用存储库抽象。如果这确实通过了过滤器并将其正确映射到原始实体属性,那将非常好。我很惊讶我找不到太多关于这个的信息。
    • @AdamD:你应该测试一下,我不是 100% 确定。但是如果我没记错的话,我前段时间问过自己这样的查询会发生什么,我对其进行了测试并得出了上述结论。 Select 返回一个 IQueryable,毕竟它仍然包含一个 SQL 提供程序引用和一个连接,所以它仍然是 LINQ to Entities 而不是 LINQ to Objects。
    • 好的,刚刚检查了 sql profiler 来测试它。它就像您想象的那样工作,并将实体属性正确映射到 sql 查询中。我还检查了一个计算属性(即 MyFlatObject.Property2 = MyEntity.PropertyA + MyEntity.PropertyB),它甚至将其正确映射到 sql。相当令人印象深刻。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多