如何知道哪个 LINQ 语句在运行时生成了 SQL 或者有没有办法将唯一的字符串注入到每个 Linq 语句中

问题描述 投票:0回答:1

我正在编写一个使用 EntityFramework 6.4.4 版本的 ASP.NET 应用程序。我在调试导致错误的 Linq 语句时遇到问题。我希望能够看到生成 Linq 语句的 C# 方法,但我不知道哪个方法生成哪个 LINQ 语句。

我从Stack Overflow复制了扩展方法供大家参考。

代码示例:

public List<EmployeeClone> GetAllEmployees()
    {
        var context = new TryDbContext();
        List<Employee> employees = context.Employees.SetQueryName().ToList();
        
        return employees;
    }

public static class ExtensionMethods
{
    public static IQueryable<T> SetQueryName<T>(this IQueryable<T> source,
      [CallerMemberName] String name = null,
      [CallerFilePath] String sourceFilePath = "",
      [CallerLineNumber] Int32 sourceLineNumber = 0)
    {
        var expr = Expression.NotEqual(Expression.Constant("Query name: " + name), Expression.Constant(null));
        var param = Expression.Parameter(typeof(T), "param");
        var criteria1 = Expression.Lambda<Func<T, Boolean>>(expr, param);

        expr = Expression.NotEqual(Expression.Constant($"Source: {sourceFilePath} ({sourceLineNumber})"), Expression.Constant(null));
        var criteria2 = Expression.Lambda<Func<T, Boolean>>(expr, param);
        Console.WriteLine($"{criteria1.Body} && {criteria2.Body}");
        return source.Where(criteria1).Where(criteria2);
    }
}

基本上,每当我调用 context.Employees 实体或当前 dbcontext 中使用的所有实体时,我都想始终执行此扩展方法。这将帮助我确定哪个方法在 SQL Server 上生成疲倦的 LINQ 语句,然后对该方法采取适当的操作。我想在 context.Entity 请求时调用该扩展方法。

List<Employee> employees = context.Employees.SetQueryName().ToList();
c# sql-server entity-framework linq
1个回答
0
投票

我已经找到了问题的部分解决方案,但我原来的问题仍然悬而未决。我正在尝试覆盖所有实体的

TagWithCallSite 
方法。我找到了一种针对特定实体类型执行此操作的方法,但我不确定如何针对所有实体类型执行此操作。它还登录了sql server profiler。

这是我用于重写特定实体类型的

TagWithCallSite 
方法的代码:

internal class Program
{
    static void Main(string[] args)
    {
        var context = new TryDbContext();

        var employees = context.Employees.TagWithCallSite().ToList();

        foreach (var employee in employees)
        {
            Console.WriteLine(employee.Name);
        }

        Console.ReadLine();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.