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

本文关键字:默认 查询 框架 设置 实体 | 更新日期: 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,也许你将能够使它的一些使用。