نمایش 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]
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))
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))