2013-06-05 72 views
3

我有一個具有(除其他外)DateTime值的實體的集合。我想查詢數據庫(使用實體框架)爲大於特定日期時間的所有實體,並從此日期時間返回closests值。時間點並不均勻分佈,我只想做一個db往返。實體框架選擇比DateTime更大的實體(加上實體之前)

例: [{T = 1},{T = 2},{T = 3},{T = 4}]

因此...如果餘查詢分貝用於與一個實體時間值大於或等於T = 3時,我也想獲得T = 2的值。也就是說

結果: [{T = 2},{T = 3},{T = 4}]

這是可能的?如果沒有,是否可以在SQL中使用?

回答

3

這將返回兩組

from o in db.Orders 
group o by o.T >= value into g 
select g.Key ? g.OrderBy(x => x.T) : 
       g.OrderByDescending(x => x.T).Take(1) 

一組將包含有T >= value實體和另一組將收到實體(如果有的話)。

UPDATE as @Gert Arnold正確指出,此查詢將與Linq to SQL一起使用,但不適用於實體框架。而不是分組你應該使用兩個子查詢的聯合:​​

db.Orders.Where(o => o.T >= value) 
     .Union(db.Orders.Where(o => o.T < value) 
         .OrderByDescending(o => o.T) 
         .Take(1)); 
+1

很好的解決方案,但EF不會允許它(類似「嵌套查詢不允許」)。最接近的可能是兩個查詢的聯合('> =',''帶'Take(1)')。 –

+0

@GertArnold感謝您的留言!我使用Linq to SQL在LinqPad中驗證了此查詢。我現在肯定需要在EF中檢查它:) –

+0

謝謝你的回答。還沒有測試過,但看起來不錯。順便說一句,你有什麼想法,這個查詢如何執行相比,如果我作爲一個存儲過程實現它? – olif