所以我有一个理想情况下使用实体框架从数据库查询的列表
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" }
但是我得到了最后一次写操作和最后读取项目
答案 0 :(得分:2)
对于每个唯一ID和操作类型,您想要最后一条记录吗?
然后需要GroupBy
和OrderByDescending
以及匿名类型:
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();