2011-01-28 12 views
0

我一直在這一段時間。我有一個類似的再次發生密鑰和序列的數據集:從包含使用Linq lambda的多個記錄的視圖的最大序列

id status  sequence 

1  open  1 

1  processing 2 

2  open  1 

2  processing 2 

2  closed  3 

一個新行添加了對每發生「動作」,所以各種IDS可以有可變序列。我需要爲每個ID獲取最大序列號,但我仍然需要返回完整的記錄。

我想與序列2結束了對1號和序列3 ID 2

我似乎無法得到這個而不選擇不同的ID,然後通過循環的結果工作,訂貨值,然後將第一個項目添加到另一個列表中,但這很慢。

var ids = this.ObjectContext.TNTP_FILE_MONITORING.Select(i => i.FILE_EVENT_ID).Distinct(); 
List<TNTP_FILE_MONITORING> vals = new List<TNTP_FILE_MONITORING>(); 
      foreach (var item in items) 
      { 

       vals.Add(this.ObjectContext.TNTP_FILE_MONITORING.Where(mfe => ids.Contains(mfe.FILE_EVENT_ID)).OrderByDescending(mfe => mfe.FILE_EVENT_SEQ).First<TNTP_FILE_MONITORING>()); 
      } 

必須有更好的方法!

回答

0

下面是我工作:

var ts = new[] { new T(1,1), new T(1,2), new T(2,1), new T(2,2), new T(2,3) }; 
var q = 
    from t in ts 
    group t by t.ID into g 
    let max = g.Max(x => x.Seq) 
    select g.FirstOrDefault(t1 => t1.Seq == max); 

(只需要適用於您的數據表,但查詢停留大約相同)

注意,與當前的方法,因爲你迭代在所有記錄中,您還可以從數據存儲獲得全部記錄。通過使用這樣的查詢,您可以轉換爲針對數據存儲的查詢,這不僅更快,而且僅返回您需要的結果(假設您使用的是實體框架或Linq2SQL)。

+0

嘗試了你的建議,但它不起作用,因爲這是一款ria/silverlight應用程序,顯然它不喜歡First()方法,並說它是最終的。我被ObjectContext包裝器弄糊塗了。 – Robert 2011-01-28 07:19:47

相關問題