首页 > 解决方案 > 如何知道在 EF 中执行查询的位置

问题描述

我在 sql profiler 中得到这个查询

SELECT [r].[OfficialFactorId], [r].[AllowCalcTax], [r].[AndicatorNumber], [r].[BasketId], [r].[BookDateTime], [r].[CalculatedWithUserCurrency], [r].[CashPayementPercent], [r].[Comment], [r].[CorporationId], [r].[CreateUserId], [r].[CustomerId], [r].[Date], [r].[EnvoyAddress], [r].[EnvoyEmail], [r].[EnvoyFirstName], [r].[EnvoyFullname], [r].[EnvoyLastName], [r].[EnvoyMobile], [r].[EnvoyNationalCode], [r].[EnvoyPhone], [r].[EnvoyTel], [r].[FactorStatusId], [r].[FactorTypeId], [r].[FirstPaymentPercent], [r].[HasRemaine], [r].[Info], [r].[IsDeleted], [r].[IsLock], [r].[IsManually], [r].[Number], [r].[ParentFactorId], [r].[PassengerFillTypeId], [r].[PaymentTypeId], [r].[PreFactor], [r].[PrePaymentPrice], [r].[PrePaymentType], [r].[Recipted], [r].[ReferenceNumber], [r].[RefundCardNumber], [r].[RegisterDateTime], [r].[RequestUserId], [r].[Revoked], [r].[RowVersion], [r].[SaleCorporationFinancialPeriodId], [r].[SaleMethod], [r].[SettlementTypeId], [r].[SiteAddress], [r].[TourDateId], [r].[TrackingResponsibleUserId], [r].[UserAgentHeader], [r].[UserNote], [r].[order_id]
FROM [ORD].[OfficialFactor] AS [r]
WHERE EXISTS (
    SELECT 1
    FROM [ORD].[OfficialFactorDetail] AS [x]
    WHERE ([x].[IsDeleted] = 0) AND ([r].[OfficialFactorId] = [x].[OfficialFactorId]))
ORDER BY [r].[OfficialFactorId]

此查询生成EF Core,这非常慢并返回3,000,000记录。

我想知道查询在项目中执行的位置。项目很大,我找不到查询。

SQL探查器中仅显示UserNameQuery

有没有办法知道查询在哪里执行?

标签: c#sqlentity-frameworksql-server-profiler

解决方案


EF 核心的一个非常有用的功能是 .TagWith 方法。

一个例子是:

var peopleList = dbContext.people
    .Where(b => b.Name != null)
    .TagWith("Getting peoplelist query.")
    .ToList();

这将转化为:

-- Getting peoplelist query.

SELECT [b].[PersonId], [b].[Email], [b].[Name], [b].[Title]
      FROM [Person] AS [b]
      WHERE [b].[Name] IS NOT NULL

它将帮助您跟踪导致问题的查询


推荐阅读