我對為什么 EF 6 的 Find 方法會生成派生查詢感到困惑。我在 LinqPad 中運行了以下兩條陳述句:
using (var ctx = new ApplicationDbContext())
{
var z = ctx.TicketTracker.Find(11277);
var x = ctx.TicketTracker.Where(w => w.TicketTrackerId == 11277).FirstOrDefault();
}
這是輸出:
SELECT
[Limit1].[TicketTrackerId] AS [TicketTrackerId],
[Limit1].[BusinessId] AS [BusinessId],
[Limit1].[DeviceId] AS [DeviceId],
[Limit1].[ETicketStorageId] AS [ETicketStorageId],
[Limit1].[TicketJSON] AS [TicketJSON],
[Limit1].[DriverUpdateId] AS [DriverUpdateId],
[Limit1].[OrderNumber] AS [OrderNumber],
[Limit1].[OrderKey] AS [OrderKey],
[Limit1].[TicketNumber] AS [TicketNumber],
[Limit1].[CustomerId] AS [CustomerId],
[Limit1].[VehicleId] AS [VehicleId],
[Limit1].[Plant] AS [Plant],
[Limit1].[Notes] AS [Notes],
[Limit1].[PostedToKeystone] AS [PostedToKeystone],
[Limit1].[EmailSuccess] AS [EmailSuccess],
[Limit1].[EmailRecipients] AS [EmailRecipients],
[Limit1].[FormType] AS [FormType],
[Limit1].[Usage] AS [Usage],
[Limit1].[JobId] AS [JobId],
[Limit1].[JobLot] AS [JobLot],
[Limit1].[CustomerPo] AS [CustomerPo],
[Limit1].[CreateDate] AS [CreateDate],
[Limit1].[PostedToKeystoneDate] AS [PostedToKeystoneDate],
[Limit1].[Devices_DeviceId] AS [Devices_DeviceId]
FROM ( SELECT TOP (2)
[Extent1].[TicketTrackerId] AS [TicketTrackerId],
[Extent1].[BusinessId] AS [BusinessId],
[Extent1].[DeviceId] AS [DeviceId],
[Extent1].[ETicketStorageId] AS [ETicketStorageId],
[Extent1].[TicketJSON] AS [TicketJSON],
[Extent1].[DriverUpdateId] AS [DriverUpdateId],
[Extent1].[OrderNumber] AS [OrderNumber],
[Extent1].[OrderKey] AS [OrderKey],
[Extent1].[TicketNumber] AS [TicketNumber],
[Extent1].[CustomerId] AS [CustomerId],
[Extent1].[VehicleId] AS [VehicleId],
[Extent1].[Plant] AS [Plant],
[Extent1].[Notes] AS [Notes],
[Extent1].[PostedToKeystone] AS [PostedToKeystone],
[Extent1].[EmailSuccess] AS [EmailSuccess],
[Extent1].[EmailRecipients] AS [EmailRecipients],
[Extent1].[FormType] AS [FormType],
[Extent1].[Usage] AS [Usage],
[Extent1].[JobId] AS [JobId],
[Extent1].[JobLot] AS [JobLot],
[Extent1].[CustomerPo] AS [CustomerPo],
[Extent1].[CreateDate] AS [CreateDate],
[Extent1].[PostedToKeystoneDate] AS [PostedToKeystoneDate],
[Extent1].[Devices_DeviceId] AS [Devices_DeviceId]
FROM [ETicket].[TicketTracker] AS [Extent1]
WHERE [Extent1].[TicketTrackerId] = @p0
) AS [Limit1]
GO
SELECT TOP (1)
[Extent1].[TicketTrackerId] AS [TicketTrackerId],
[Extent1].[BusinessId] AS [BusinessId],
[Extent1].[DeviceId] AS [DeviceId],
[Extent1].[ETicketStorageId] AS [ETicketStorageId],
[Extent1].[TicketJSON] AS [TicketJSON],
[Extent1].[DriverUpdateId] AS [DriverUpdateId],
[Extent1].[OrderNumber] AS [OrderNumber],
[Extent1].[OrderKey] AS [OrderKey],
[Extent1].[TicketNumber] AS [TicketNumber],
[Extent1].[CustomerId] AS [CustomerId],
[Extent1].[VehicleId] AS [VehicleId],
[Extent1].[Plant] AS [Plant],
[Extent1].[Notes] AS [Notes],
[Extent1].[PostedToKeystone] AS [PostedToKeystone],
[Extent1].[EmailSuccess] AS [EmailSuccess],
[Extent1].[EmailRecipients] AS [EmailRecipients],
[Extent1].[FormType] AS [FormType],
[Extent1].[Usage] AS [Usage],
[Extent1].[JobId] AS [JobId],
[Extent1].[JobLot] AS [JobLot],
[Extent1].[CustomerPo] AS [CustomerPo],
[Extent1].[CreateDate] AS [CreateDate],
[Extent1].[PostedToKeystoneDate] AS [PostedToKeystoneDate],
[Extent1].[Devices_DeviceId] AS [Devices_DeviceId]
FROM [ETicket].[TicketTracker] AS [Extent1]
WHERE 11277 = [Extent1].[TicketTrackerId]
我希望 Find 簡單地生成一個選擇陳述句,但在我開始切換代碼之前,EF 是否有理由使用簡單的方法添加這個復雜的查詢?我確實讀過 Find 使用內部快取而 Where 沒有,但除此之外我還缺少什么?
uj5u.com熱心網友回復:
當您看到隨機查詢似乎無緣無故運行緩慢,或者資源消耗非常高時,這通常表明存在索引問題。
- 把這個答案放在這里,因為這實際上是 OPs 查詢的問題。
uj5u.com熱心網友回復:
這些查詢是正常的,不會導致任何性能問題。對于一些更復雜的查詢,您可能會發現撰寫自定義Raw SQL Query是值得的,但在這種情況下則不然。
這個查詢要么總是占用太多資源,要么是最慢的。
打開查詢存盤以了解它占用了哪些資源以及為什么它很慢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/442866.html
