我試圖獲取更改的記錄,其中車輛的點火改變。這是我的SQL表。相關的LINQ查詢優化
即我要取的記錄47890及和記錄47879.
我已經寫了下面的相關LINQ查詢。
var sData = (from log in db.GSMDeviceLogs
where log.Vehicle.VehicleId == vehicleId
where log.IgnitionOn != (from prevLog in db.GSMDeviceLogs
where prevLog.Vehicle.VehicleId == vehicleId
where prevLog.DateTimeOfLog < log.DateTimeOfLog
orderby prevLog.DateTimeOfLog descending
select prevLog.IgnitionOn).FirstOrDefault()
orderby log.DateTimeOfLog ascending
select new { LogId = log.GSMDeviceLogId,
Ignition = log.IgnitionOn,
Date = log.DateTimeOfLog,
Location = log.Location }).ToList();
它提供了以下異常:
An exception of type 'System.Data.Entity.Core.EntityCommandExecutionException' occurred in EntityFramework.SqlServer.dll but was not handled in user code
內部異常說:
{"Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding."}
我希望這是由於查詢是非常低效佔用太多的時間來執行。我們如何優化LINQ查詢?
可以有成千上萬的車輛記錄。將所有內容加載到內存中會使其非常緩慢。 –
你不知道沒有嘗試。這完全取決於你的設計。在關係型數據庫中查詢這種類型的順序數據(例如時間序列)也不會很有效 - 您需要爲每條記錄運行一個子查詢。我會着眼於編寫一個使用遊標的存儲過程(是的 - 這是對遊標的完全有效使用),甚至可以編寫[CLR SQL存儲過程](http://msdn.microsoft.com/zh-cn/我們/庫/ 5czye81z(v = VS.90)的.aspx)。 –
請在您的屏幕截圖上突出顯示「47890」和「47879」的記錄。自己找到它們會導致眼睛疲勞。 – Neolisk