我正在使用Entity Framework核心查询SQL Server数据库.我想知道是否有一种方法来判断是否在执行一个现有的查询之前应用了AsSplitQuery()?我知道,如果你输出查询ToQueryString(),会有一条消息说:

这个LINQ查询是以拆分查询模式执行的,所显示的SQL是第一个要执行的查询.还可以根据第一查询的结果执行附加查询.

然而,这似乎不是解决我问题的干净方法.任何帮助将不胜感激.

推荐答案

你可以使用简单的扩展方法来判断查询表达式中是否使用了AsSplitQuery:

var isSplitQuery = query.IsUsingSplitQuery();

和执行:

public static class QueryRelationalExtensions
{
    public static bool IsUsingSplitQuery<T>(this IQueryable<T> query)
    {
        var current = query.Expression;

        while (current is MethodCallExpression methodCall)
        {
            if (methodCall.Method.DeclaringType == typeof(RelationalQueryableExtensions))
            {
                if (methodCall.Method.Name == nameof(RelationalQueryableExtensions.AsSplitQuery))
                    return true;
                if (methodCall.Method.Name == nameof(RelationalQueryableExtensions.AsSingleQuery))
                    return false;
            }

            if (methodCall.Arguments.Count == 0)
                break;

            current = UnwrapConvert(methodCall.Arguments[0]);
        }

        return false;
    }

    [return: NotNullIfNotNull(nameof(ex))]
    static Expression? UnwrapConvert(Expression? ex)
    {
        if (ex == null)
            return null;

        switch (ex.NodeType)
        {
            case ExpressionType.ConvertChecked:
            case ExpressionType.Convert:
            {
                if (((UnaryExpression)ex).Method == null)
                    return UnwrapConvert(((UnaryExpression)ex).Operand);
                break;
            }
        }

        return ex;
    }
}

注意,这种方法不判断QuerySplittingBehavior,它也可以添加,但与传递DbContextIsUsingSplitQuery的方法.

Csharp相关问答推荐

当MD5被废弃时,如何在Blazor WASM中使用它?

ASP.NET MVC中创建视图的过滤器

如何分配对象后的class的属性?

在具有不同属性名称的两个类之间创建关系

如何注册类使用多级继承与接口

更改执行目录

当索引和外键是不同的数据类型时,如何设置导航属性?

在.NET 7.0 API控制器项目中通过继承和显式调用基类使用依赖项注入

当我没有此令牌时,为什么语法报告EOF错误?

Linux Docker上的.NET6在某个时间抛出后,在加密操作期间发生System.Security.Cryptography.CryptographicException:错误

如何在CSharp中将json字符串转换为DataTable?

EF核心新验证属性`DeniedValues`和`StringCompison`不起作用

正在寻找新的.NET8 Blazor Web应用程序.如何将.js添加到.razor页面?

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

记录类型';==运算符是否与实现IEquatable<;T&>;的类中的';equals&>方法执行等价比较?

VS 2022与VS 2019:如何/为什么创建额外的任务?

当我将`ConcurentDictionary`转换为`IDictionary`时,出现了奇怪的并发行为

C#中类库项目的源代码生成器

为什么我的自定义Json.net转换器不工作?

无法创建&Quot;&Quot;类型的实例,因为无法将一个或多个参数绑定到