C# Linq根据某些条件获取行
假设我们有这样的行C# Linq根据某些条件获取行,c#,linq,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
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
现在我想要的是首先按日期从表中获取最新的数据,但有时日期是相同的,所以我需要获得“修订目标”,但如果没有“修订目标”行,那么我需要“目标”,但如果没有“目标”行,那么我需要“目标”,但如果没有“目标”,那么我将获得“最后一组”
所以我在这里忽略了更新的和空的
这是我正在尝试的,但不能再继续了
var tar = (from m in table1 where m.Description != "Updated" && m.Description != NULL
select m).OrderByDescending(x => x.Date).FirstOrDefault();
请注意,根据我解释的条件,我只需要1行
编辑
我在下面的大多数投票中尝试了答案,我在IndexOf方法上得到了错误,因为它不需要1个参数…所以你只是缺少了一点,在这里你有一些关于获取哪个“描述”的规则,把它们按你想要的顺序放在一个数组中
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();
所以你只是缺少了一点,你有一些规则,关于哪些“描述”可以得到,把它们按照你想要的顺序放在一个数组中
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();
好吧,只需添加另一个
订单
如果您在linq to entities
中,您可能需要多个三元组,如果您在linq to objects
中,您可以使用字典或类似的工具使事情更清楚
.OrderByDescending(x => x.Date)
.ThenBy(x => x.description == "RevisedTarget"
? 0
: (x.description == "Target" ? 1 :2)
)
.FirstOrDefault()
好吧,只需添加另一个
订单
如果您在linq to entities
中,您可能需要多个三元组,如果您在linq to objects
中,您可以使用字典或类似的工具使事情更清楚
.OrderByDescending(x => x.Date)
.ThenBy(x => x.description == "RevisedTarget"
? 0
: (x.description == "Target" ? 1 :2)
)
.FirstOrDefault()
在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();
在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();
您可能希望将&
替换为&&
…您可能希望将&
替换为&&
…我打算建议使用带有值的枚举,但这要简单得多。谢谢,但它说没有重载方法IndexOf接受1个参数:(,即使我使用system.linqTry添加时使用的是List
而不是数组。List.IndexOf
肯定只接受一个参数。@CustomizedName-你的目标是什么.NET framework版本?@CustomizedName-好的,我一定是失去了绘图-请参阅更新。你是对的,你不能像我那样调用IndexOf
。太多了javascript我忘了我的C#!我想建议使用带有值的枚举,但这要简单得多。谢谢,但它说没有重载方法IndexOf需要1个参数:(,即使我使用system.linqTry添加时使用的是List
而不是数组。List.IndexOf
肯定只接受一个参数。@CustomizedName-你的目标是什么.NET framework版本?@CustomizedName-好的,我一定是失去了绘图-请参阅更新。你是对的,你不能像我那样调用IndexOf
。太多了我忘了我的C#!