实体框架:设置查询的默认限制
本文关键字:默认 查询 框架 设置 实体 | 更新日期: 2023-09-27 18:05:44
我刚刚开始编写一些使用EF6 (code First)的代码,而且写得相当糟糕。我发现在许多情况下,查询在分页之前返回了数千行(分页是在对可查询对象进行枚举之后应用的)。
是否有办法拦截所有IQueryable
执行默认并应用.Take(128)
?
如果你有不好的代码,你能做的最好的当然是修复它,而不是添加奇怪的变通方法。
你可以尝试使用一个奇怪的变通方法是(相对较新的?)IDbCommandTreeInterceptor
允许您在"表达式"级别重写表达式树:
public class LimitInterceptor : IDbCommandTreeInterceptor
{
public void TreeCreated(DbCommandTreeInterceptionContext interceptionContext)
{
if (interceptionContext.OriginalResult.DataSpace == DataSpace.SSpace)
{
var queryCommand = interceptionContext.Result as DbQueryCommandTree;
if (queryCommand != null)
{
var newQuery = queryCommand.Query.Accept(new LimitVisitor());
interceptionContext.Result = new DbQueryCommandTree(
queryCommand.MetadataWorkspace,
queryCommand.DataSpace,
newQuery);
}
}
}
}
// rewrite the tree - needs adjustment probably, looks like a very naive implementation (?)
public class LimitVisitor : DefaultExpressionVisitor
{
public override DbExpression Visit(DbScanExpression expression)
{
// here we go!
return DbExpressionBuilder.Limit(expression, 128);
}
}
// will be automatically picked up
public class MyConfiguration : DbConfiguration
{
public MyConfiguration()
{
AddInterceptor(new LimitInterceptor());
}
}
从这篇文章中找到了关于IDbCommandTreeInterceptor
的信息。还有另一个拦截选项(但它是为已经生成的sql) IDbCommandInterceptor
,也许你将能够使它的一些使用。