有没有办法冻结IQueryable
这样在访问数据库时就不会向查询添加额外的连接?例如,我可以做一个.ToList()
冻结查询,但这会对性能产生影响,因为我所做的任何过滤都是在中间层上进行的,并且我没有从数据库服务器上的预过滤中获得任何性能提升?
为了清楚起见编辑:
我有一个 OData 服务,它返回一个IQueryable
客户可以根据需要过滤/排序/项目。我只是想阻止他们提取更多数据。我可以这样做ToList().AsQueryable()
,但这失去了lazyLoading的优势,也失去了允许客户端过滤请求的全部目的。
我查看的一个选项是设置:EnableQueryAttribute.AllowedQueryOptions
排除Expand
,但是即使我的初始查询已扩展,客户端仍然无法选择这些部分。
我假设你实际上有一个IQueryable<T>
代替IQueryable
.
如果您不希望您的客户访问所有IQueryable<T>
方法,不返回IQueryable<T>
。由于您希望它们只能过滤/排序/项目,因此创建一个包含IQueryable<T>
但只公开所需的方法,并使用它:
public interface IDataResult<T>
{
IDataResult<T> FilterBy(Expression<Func<T, bool>> predicate);
IDataResult<TResult> ProjectTo<TResult>(Expression<Func<T, TResult>> predicate);
IDataResult<T> SortBy<TKey>(Expression<Func<T, TKey>> keySelector);
IDataResult<T> SortByDescending<TKey>(Expression<Func<T, TKey>> keySelector);
List<T> ToList();
IEnumerable<T> AsEnumerable();
}
public class DataResult<T> : IDataResult<T>
{
private IQueryable<T> Query { get; set; }
public DataResult(IQueryable<T> originalQuery)
{
this.Query = originalQuery;
}
public IDataResult<T> FilterBy(Expression<Func<T, bool>> predicate)
{
return new DataResult<T>(this.Query.Where(predicate));
}
public IDataResult<T> SortBy<TKey>(Expression<Func<T, TKey>> keySelector)
{
return new DataResult<T>(this.Query.OrderBy(keySelector));
}
public IDataResult<T> SortByDescending<TKey>(Expression<Func<T, TKey>> keySelector)
{
return new DataResult<T>(this.Query.OrderByDescending(keySelector));
}
public IDataResult<TResult> ProjectTo<TResult>(Expression<Func<T, TResult>> predicate)
{
return new DataResult<TResult>(this.Query.Select(predicate));
}
public List<T> ToList()
{
return this.Query.ToList();
}
public IEnumerable<T> AsEnumerable()
{
return this.Query.AsEnumerable();
}
}
这样,您还可以防止 EF 和 DB 相关的依赖关系在您的应用程序中蔓延。任何更改IQueryable<T>
方法将包含在此类中,而不是分布在各处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)