【发布时间】:2016-08-09 14:55:11
【问题描述】:
有没有办法冻结IQueryable 以便在访问数据库时不会向查询添加额外的连接?例如,我可以执行.ToList() 来冻结查询,但这会影响性能,因为我所做的任何过滤都在中间层,并且我没有从数据库服务器上的预过滤中获得任何性能提升?
为清楚起见进行编辑:
我有一个 OData 服务,它返回一个 IQueryable,客户端可以根据需要过滤/排序/项目。我只是想阻止他们提取更多数据。我可以通过ToList().AsQueryable() 来做到这一点,但这失去了lazyLoading 的优势,以及允许客户端过滤请求的全部目的。
我查看的一个选项是设置:EnableQueryAttribute.AllowedQueryOptions 以排除 Expand,但是即使我的初始查询已扩展,客户端仍然无法选择这些部分。
【问题讨论】:
-
不太清楚您想要“冻结”查询是什么意思。
-
您是否有机会将谓词作为参数传入并将其用作过滤器,这样您就可以完全避免问题?
-
如果在访问数据库时添加了其他连接,我怀疑这更多是您的 Linq 表达式的一个因素。请发布一些说明问题的代码。
-
也许我是唯一的一个,但我可以看到 OP 的来源。他可能希望将
IQueryable从数据层传回,而不会产生ToList()的成本,但要确保调用者不会弄乱查询。如果可能的话,我想知道。 -
我不知道它是否有帮助,但尝试使用 AutoMapper 及其QueryableExtensions,您可以将返回的类型转换为新映射的
IQueryable类型。将其想象为在 SQL 中创建视图,最终用户将很难选择更多数据,因为您没有设置映射,但他们仍然可以对其应用自己的过滤器。只需确保您的 DAL 实体设置为internal,以便外部用户无法引用它们。如果可行,我会将此评论转为答案。
标签: c# linq entity-framework odata