Linq根据某些条件获取行

时间:2014-12-05 09:00:46

标签: c# 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

现在我想要的是先按日期从表中获取最新信息,但有时日期是相同的,所以我需要得到"修订目标"但是如果没有#34;修订目标"然后我需要"目标"但如果目标没有排,那么我需要"目标"但如果没有" Target"然后我将采取" Last Set"。

所以我在这里忽略了更新和NULL。

这就是我正在尝试但不能进行的任何事情,

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

请注意我根据我解释的条件只需要1行。

修改

我尝试使用以下大多数投票回答我在IndexOf方法上遇到错误,因为它不需要1个参数...

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:2)

好吧,只需添加另一个Ordering

如果你在linq to entities,你认为你需要多个三元组,如果你在linq to objects,你可以使用词典或类似的东西来使事情更清楚。

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

答案 2 :(得分:0)

在Linq中

Case when订购

 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();