我有2條基本上做同樣的事情的SQL語句,也就是說,從基於一組記錄的日期時間字段的表中檢索最後一條記錄。我正在使用數據優先的實體框架模型。我如何使用LINQ Lambda函數編寫這些SQL語句中的任何一個?如何編寫linq語句來獲取一組記錄的最後一個
即
var u = db.AccessCodeUsage.Where(...).GroupBy(...)
而不是
var u = from a in db.AccessCodeUsage
where ...
group by ...
SQL語句:
SELECT *
FROM AccessCodeUsage a
WHERE NOT EXISTS (SELECT 1
FROM AccessCodeUsage
WHERE LocationId = a.LocationId
AND Timestamp > a.Timestamp)
SELECT a.*
FROM AccessCodeUsage a
WHERE a.Timestamp =
(SELECT MAX(Timestamp)
FROM AccessCodeUsage
WHERE a.LocationId = LocationId
AND a.AccessCode = AccessCode
GROUP By LocationId, AccessCode)
好帖子,我有一個類似的問題,但在GroupBy()中使用匿名類型,因爲你已經允許我得到我需要的。 – 2012-08-17 09:08:12
酷@PeadarDoyle。我用'GroupBy()'給出的一條建議是,如果你不確定如何將它轉換成一個好的單個查詢,總是值得分析它是如何工作的。有些使用不能變成只有一個查詢,並且對數據庫性能的影響是可怕的(更糟糕的是,它對測試數據通常很好,對實際數據的損害也很小)。在這個例子中,我會說它*可能*應該是好的,但我會檢查反正... – 2012-08-17 09:14:54
如果你*發現查詢被轉換成大量的SQL查詢把'.AsEnumerable()'之前'.GroupBy()'。通常情況下,將'.AsEnumerable()'放到支持數據庫的Linq查詢中,會導致性能下降(數據庫工作量減少,流量增加,.NET工作量增加),但是'.GroupBy()'那些不能很好地轉換的是一個例外,在這個過程的早期步驟中將它移動到.NET是一個性能上的勝利(不是很小的一個,可能是因爲太慢而無法用於快速注意)。 – 2012-08-17 09:17:33