计算LINQ中的组上的行号,只取那些行号为1的行?

时间:2019-01-24 12:45:24

标签: c# linq sql-to-linq-conversion

LINQ对应项是什么,以获取分区上的行号,然后仅获取行号为1的那些记录?

这是我要转换为其LINQ实现的SQL:

select
   ROW_NUMBER () OVER (PARTITION BY TASKKEY  ORDER BY CREATEDON DESC) as rn
   ,pwt.*
from
   TaskClass pwt
where pwt.STATUS = 0

这是我到目前为止尝试过的LINQ,但是没有给出正确的结果

            var output = Result.GroupBy(t => t.TaskKey)
            .SelectMany(g => g.Select((j, i) =>
                new
               {
                   //Rest of the fields 
                   ,
                   rn = i + 1 //Row number
               }

                )
            )
            .Where(e => e.rn == 0)
            .Select(
            y => new TaskClass
            {
                //Rest of the fields
            }

            ).OrderBy(o => o.Id )
            .ToList<TaskClass>()
            );

简而言之,我想从具有相同TaskKey的行中找到哪个条目具有最新的CreatedOn,但使用的是纯LINQ。

1 个答案:

答案 0 :(得分:1)

我不确定您为什么需要行号,但是,如果您想通过TaksKey区分并获取最新条目,则为:

var output = Result.GroupBy(a => a.TaskKey)
    .ToDictionary(a => a.Key, b => b.Value.OrderBy(CreatedOn).First());

与某些过滤器相同。

var output = Result.Where(a => a.STATUS == 0)
    .GroupBy(a => a.TaskKey)
    .ToDictionary(a => a.Key, b => b.Value.OrderBy(CreatedOn).First());

我尚未对此进行测试,因此请检查日期顺序,如果不合适,请使用Last而不是First