如果你使用实体投影,你会得到IQueryable的好处吗



假设我有一个这样的方法:

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相同。

最新更新