2014-12-05 128 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();