Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq根据某些条件获取行_C#_Linq - Fatal编程技术网

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#!