C# linq 查询按两个条件排名

本文关键字:两个 条件 linq 查询 | 更新日期: 2023-09-27 18:35:08

>use C# linq query,我想按 id 和更新时间获得日期排名。id:包含在列表"idList"中更新时间:数据时间的类型

示例数据:

查询:

.onecenter{text-align:center;width:150px;}
<table  border="1" cellspacing="0" cellpadding="0">
    <tr >
        <td class='onecenter'>id</td>
        <td class='onecenter'>updatetime</td>
    </tr>
    <tr >
        <td class='onecenter'>1</td>
        <td class='onecenter'>2016-02-16</td>
    </tr>
    <tr >
        <td class='onecenter'>2</td>
        <td class='onecenter'> 2016-02-14</td>
    </tr>
    <tr>
        <td  class='onecenter'>3</td>
        <td  class='onecenter'>2016-02-15</td>
    </tr>
    <tr>
        <td class='onecenter'>4</td>
        <td  class='onecenter'>2016-02-17</td>
    </tr>
</table>

idList:

2,3

结果应为:

    .onecenter{text-align:center;width:150px;}
    <table  border="1" cellspacing="0" cellpadding="0">
        
        <tr >
            <td class='onecenter'>id</td>
            <td class='onecenter'>updatetime</td>
        </tr>
       <tr>
            <td  class='onecenter'>3</td>
            <td  class='onecenter'>2016-02-15</td>
        </tr>
        <tr >
            <td class='onecenter'>2</td>
            <td class='onecenter'> 2016-02-14</td>
        </tr>
        <tr>
            <td class='onecenter'>4</td>
            <td  class='onecenter'>2016-02-17</td>
        </tr>
        <tr >
            <td class='onecenter'>1</td>
            <td class='onecenter'>2016-02-16</td>
        </tr>
        
       
    </table>

如何通过 LINQ 查询获取结果。

我试过了:

var data1 = query.Where(m => idList.Contains(m.ID)).OrderByDescending(x => x.updatetime);
var data2 = query.Where(m => !idList.Contains(m.ID)).OrderByDescending(x => x.updatetime);
var date = data1.Concat(data2).ToList();

和:

var data = query.GroupBy(m => idList.Contains(m.ID)).OrderByDescending(x => x.updatetime);

但它没有得到正确的结果。

C# linq 查询按两个条件排名

我会使用这个查询:

var result = query.OrderByDescending(q => idList.Contains(q.ID) ? 1 : 0)
                  .ThenByDescending(q => q.updatetime);

尝试使用这个:

var data1 = query.Where(x => idList.Contains(x.ID)).OrderByDescending(y => y.UpdateTime);
var data2 = query.Except(data1).OrderByDescending(y => y.UpdateTime);
var data = data1.Concat(data2).ToList();

使用第二个Except删除data1中已有的任何内容,然后您应该能够得到这个:

[2016-02-17 06:22:04.167 UTC] 3 2/15/2016 12:00:00 AM
[2016-02-17 06:22:04.169 UTC] 2 2/14/2016 12:00:00 AM
[2016-02-17 06:22:04.170 UTC] 4 2/17/2016 12:00:00 AM
[2016-02-17 06:22:04.170 UTC] 1 2/16/2016 12:00:00 AM

编辑:

如果您的数据很多,您可以考虑将项目保留为IEnumerable,直到您需要处理它而不是将其更改为 List .这可能会节省一些时间:

var data1 = query.Where(x => idList.Contains(x.ID)).OrderByDescending(y => y.UpdateTime);
var data2 = query.Except(data1).OrderByDescending(y => y.UpdateTime);
var data = data1.Concat(data2); //don't change to List here
foreach(var dat in data){ //use it by fetching it one by one like this
}