2012-11-12 146 views
1

多列實體框架導致我有如下表:如何篩選使用lambda表達式

enter image description here

,後面的數據:

enter image description here

我怎樣才能篩選結果,以便我只從每個omraade_id(按排序降序)獲取最新一行?

在這種情況下將與ID行:10101005

-

從@ lazyberezovsky的回答,我已經創建了下面的表達式:

dbConnection = new ElecEntities(); 

      var query = from data in dbConnection.Valgdata 
      orderby data.timestamp descending 
      group data by data.omraade_id into g 
      select g.FirstOrDefault(); 

      return query.ToList(); 

它返回兩個ID爲3和4的行是數據庫中的前兩行,也是具有最低時間戳的行。任何想法爲什麼?

回答

1

我沒有EF的經驗,所以我不確定是否只有SQL-esque的linq在這裏工作。一個普通的C#-ish:

var query = dbConnection.Valgdata.GroupBy(u => u.omraade_id) 
     .Select(x => x.FirstOrDefault(y => x.Max(p => p.timestamp) == y.timestamp)); 
+0

This Works! Coool:D – Kenci

+0

@Kenci爲什麼是FirstOrDefault? 「First」適用於所有情況!因爲無論如何你總會有最大時間戳。 – nawfal

+0

時間戳列可以爲空,並且當我用First()執行查詢時它會拋出一個錯誤 - 但我應該改變這個:) – Kenci

0
var query = from v in dbConnection.Valgdata 
      orderby v.timestamp descending 
      group v by v.omraade_id into g 
      select g.First(); 

這將只返回每個omraade_id具有最大時間戳的記錄。

更新上面的查詢對我很好(至少對於MS SQL Linq提供者)。你也不需要做FirstOrDefault - 如果omraade_id被分組,那麼它肯定至少有一行。

var query = from v in dbConnection.Valgdata 
      group v by v.omraade_id into g 
      select g.OrderByDesc(x => x.timestamp).First(); 
+0

您能否檢查我更新的問題?謝謝 – Kenci

+0

它返回相同的,如果我寫降序或升序 – Kenci

+0

@Kenci查看更新的答案。也許它的linq提供程序的具體問題。嘗試在分組後排序記錄。這絕對應該工作。 –

0

您已將濾鏡放在每個項目上。它應該應用於完整的查詢結果,而不是每個項目。

以下爲更新後的查詢。

var query = (from data in dbConnection.Valgdata 
     orderby data.timestamp descending 
     group data by data.omraade_id into g 
     select g).FirstOrDefault(); 
+0

感謝您的回答。我已經嘗試了你的建議,它返回了9個結果(所有id = 6的行) – Kenci

2
var query = dbConnection.Valgdata 
         .GroupBy(x => x.omraade_id) 
         .Select(g => g 
          .OrderByDescending(x => x.timestamp) 
          .FirstOrDefault()); 
+0

感謝您的嘗試。這將返回所有11行(返回行= 3 9次,行= 4 2次)? – Kenci

+0

@Kenci更新了我的答案。 –

+0

再次感謝。我很欣賞這種努力。這將返回帶有兩個鍵的分組對象。第一個鍵包含第一個omraade_id的所有行,第二個鍵包含第二個omraade_id的所有行(未排序)。 – Kenci

0

這是我的解決方案迄今:

var data = dbConnection.Valgdata.Where(x => x.godkendt == false).ToList(); 
var dataGrouped = data.GroupBy(x => x.omraade_id).ToList(); 

List<Valgdata> list = new List<Valgdata>(); 

foreach (var grpdata in dataGrouped) 
      { 
       var dataGroup = grpdata.OrderByDescending(x => x.timestamp).ToList(); 
       list.Add(dataGroup.FirstOrDefault()); 
      } 
return list; 

我不知道這是否是最有效的,但它的作品。