2014-12-05 126 views
0

讓我們假設我們有這樣的行的LINQ得到行,根據一些條件來

id  data1  data2  description date 
1   1   2   NULL  05/12/2014 
2   3   3   Last Set  05/12/2014 
3   1   2   Target  05/12/2014 
4   0   0   Updated  05/12/2014 
5   1   0  Revised Target 05/12/2014 

現在,我要的是得到最新出的日期表的第一,但有時日期是一樣的,所以我需要以獲得「修訂目標」,但如果沒有「修訂目標」行,那麼我需要「目標」,但如果目標沒有行,那麼我需要「目標」,但如果沒有「目標」我會拿「最後一套」。

所以我忽略更新和空的這裏。

這就是我想,但不能去任何futther,

var tar = (from m in table1 where m.Description != "Updated" && m.Description != NULL 
          select m).OrderByDescending(x => x.Date).FirstOrDefault(); 

請注意,我只需要根據我解釋的條件1點的行。

編輯

我試着用下面我上的IndexOf方法得到的錯誤,因爲它不採用1個參數得票最多的答案...

+2

你可能要替換'&'和''&& ... – 2014-12-05 09:01:59

回答

2

,只需添加另一個Ordering

認爲你需要多個三元如果您在linq to entities的時候,你可以使用字典或類似的東西,以使事情更清楚,如果你在linq to objects是。

.OrderByDescending(x => x.Date) 
.ThenBy(x => x.description == "RevisedTarget" 
      ? 0 
      : (x.description == "Target" ? 1 :2) 
) 
.FirstOrDefault() 
4

所以你只是缺少,你有一些位規則關於其「說明」就搞定了,把這些在爲了一個數組,你希望他們

var descriptionOrder = new[]{"Revised Target","Target","Last Set"}; 

,並以此來進一步排序結果:

var tar = (from m in table1 
      where m.Description != "Updated" && m.Description != null 
      select m).OrderByDescending(x => x.Date) 
      .ThenBy(x => Array.IndexOf(descriptionOrder,x.Description)) 
      .FirstOrDefault(); 
+0

我會使用帶有枚舉值建議,但是這是要簡單得多。 – toadflakz 2014-12-05 09:07:39

+0

謝謝,但它說沒有超載的方法IndexOf需要1個參數:(即使我添加使用system.linq – Mathematics 2014-12-05 09:10:56

+1

嘗試使用'列表'而不是一個數組.'列表 .IndexOf'絕對只有1個參數。 – toadflakz 2014-12-05 09:29:06

0

Case when排序Linq中

var tar = table1.Where(x=>x.description != null && x.description != "Updated") 
      .OrderByDescending(x=>x.description == "Revised Target" ? 3 : 0) 
      .ThenByDescending(x=>x.description == "Target" ? 2 : 0) 
      .ThenByDescending(x=>x.description =="Last Set" ? 1 :0) 
      .ThenByDescending(x=>x.date) 
      .FirstOrDefault();