假设我们有这样的行,
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个参数...
答案 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)
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();