我刚刚开始研究一些使用EF6(代码优先)的代码而且编写得非常糟糕。我发现很多情况下,在查询之前从查询中返回了几千行(在枚举可查询之后应用了分页)。
是否有办法在默认情况下拦截所有IQueryable
次执行 并应用.Take(128)
?
答案 0 :(得分:1)
如果你的代码不好,你当然可以做的最好就是解决它,而不是添加奇怪的解决方法..
您可以尝试使用的一个选项是奇怪的解决方法(相对较新?)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());
}
}
从this post找到大约IDbCommandTreeInterceptor
。
还有另一个拦截选项(但它适用于已经生成的sql)IDbCommandInterceptor
,也许你可以使用它。