使用linq查询最后的项目

时间:2018-03-23 10:27:23

标签: c# linq

所以我有一个理想情况下使用实体框架从数据库查询的列表

SELECT
  'XXX',
  'JP',
  ACC.H_KACCT_BK,
  LACC.H_KACCT_ID,
  HSAL.H_POSAL_BK,
  LACC.H_POSAL_ID
FROM DRD_ORD LACC
INNER JOIN TRC_ORD ACC
ON LACC.H_KACCT_ID   =ACC.H_KACCT_ID
AND LACC.SYS_DB_NAME =ACC.SYS_DB_NAME
AND ACC.SYS_DB_NAME    ='JP'
INNER JOIN H_SALES HSAL
ON LACC.H_POSAL_ID     = HSAL.H_POSAL_ID
AND LACC.SYS_DB_NAME   = HSAL.SYS_DB_NAME
AND HSAL.SYS_DB_NAME    ='JP'
WHERE LACC.SYS_DB_NAME ='JP'
and (LACC.H_POSAL_ID, LACC.H_KACCT_ID) IN (SELECT H_POSAL_ID, MAX(H_KACCT_ID) H_KACCT_ID from DRD_ORD group by H_POSAL_ID)
and LACC.H_POSAL_ID = 302774;

填写的结果将是这个

var list = context.Items;

所以我想通过操作和最后日期来缩小这个列表。

var list = new List<Item>{
new Item { id=1, operation="write", date="23.03.2018 08:25:45" },
new Item { id=1, operation="read",  date="23.03.2018 09:40:15" },
new Item { id=1, operation="read",  date="23.03.2018 10:15:17" },
new Item { id=1, operation="read",  date="23.03.2018 11:46:39" }

但是我得到了最后一次写操作和最后读取项目

2 个答案:

答案 0 :(得分:2)

对于每个唯一ID和操作类型,您想要最后一条记录吗?

然后需要GroupByOrderByDescending以及匿名类型:

var query = context.Items
    .GroupBy(x => new { x.Id, x.Operation } )
    .Select(g => g.OrderByDescending(x => x.Date).First()); // presuming Date is a DateTime not string

如果Date实际上是示例中的字符串,则应将其更改为DateTime。你真的不想总是解析它。将正确的类型存储在数据库中。您将获得更多的安全和性能。

答案 1 :(得分:0)

LINQ下面将按数据对项目进行排序,然后按操作对项目进行分组,并从每个组中选择第一项。

var result = list.OrderByDescending(d => d.date)
    .GroupBy(i => new { i.id, i.operation })
    .Select(g => g.FirstOrDefault())
    .ToList();