نمایش SQL تولیدی از کوئری های LINQ در EF Core 5

در نگارش جدید Entity Framework Core 5.0 امکان مشاهده SQL تولید شده از کوئری های خود وجود دارد که این امکان با متد ()ToQueryString  فراهم می شود .

به عنوان مثال یک کوئری لینک را تولید میکنیم و از این متد استفاده کنیم :

public IActionResult Index()
{
    var prefix = "A";
    var query = _dataContext.Projects
                        .Include(p => p.Customer)
                        .Where(p => p.Customer.Name.StartsWith(prefix))
                        .OrderBy(p => p.Customer.Name)
                        .ThenBy(p => p.Title)
                        .Select(p => new { Project = p.Title, Customer = p.Customer.Name });
 
    var queryString = query.ToQueryString();
    return View();
}

در هنگام اجرای کد و در حالت Debug میتوان SQL تولید شده را پنجره Text Visualizer مشاهده کرد . 

زمانی که ()ToQueryString کار نمی کند . 

وقتی از این متد در روش های ()ToList و ()ToListAsync استفاده کنیم ولی وقتی از ()FirstOrDefault و ()FirstOrDefaultAsync استفاده میکنیم SQL های بیشتری را اضافه میکند که با روش ()ToQueryString نمی توانیم آن ها را ببینیم . 

یک نمونه از کوئری ()FirstOrDefaultرا با هم ببینیم : 

SELECT TOP(1) [p].[Title] AS [Project], [c].[Name] AS [Customer]
FROM [Projects] AS [p]
LEFT JOIN [Customers] AS [c] ON [p].[CustomerId] = [c].[Id]
WHERE (@__prefix_0 = N'') OR ([c].[Name] IS NOT NULL AND (LEFT
([c].[Name], LEN(@__prefix_0)) = @__prefix_0))
ORDER BY [c].[Name], [p].[Title]

تقریبا یکسان است اما وقتی از متد ()Count استفاده میکنیم پرس و جو متفاوت تر می شود 

 SELECT COUNT(*)
FROM [Projects] AS [p]
LEFT JOIN [Customers] AS [c] ON [p].[CustomerId] = [c].[Id]
WHERE (@__prefix_0 = N'') OR ([c].[Name] IS NOT NULL AND (LEFT
([c].[Name], LEN(@__prefix_0)) = @__prefix_0))