实体框架:设置查询的默认限制

时间:2015-07-30 10:50:41

标签: c# entity-framework-6

我刚刚开始研究一些使用EF6(代码优先)的代码而且编写得非常糟糕。我发现很多情况下,在查询之前从查询中返回了几千行(在枚举可查询之后应用了分页)。

是否有办法在默认情况下拦截所有IQueryable次执行 并应用.Take(128)

1 个答案:

答案 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,也许你可以使用它。