【发布时间】:2020-05-25 05:20:28
【问题描述】:
我有一个包含以下列和示例数据的表格:
acteename updated_at count (count is not sorted in db)
dev-52 2/7/2020 5:56:43 PM 1
dev-52 2/7/2020 5:56:52 PM 2
dev-52 2/7/2020 5:57:00 PM 3
dev-52 2/7/2020 5:57:49 PM 4
dev-52 2/7/2020 5:59:19 PM 5
dev-52 2/7/2020 6:01:51 PM 6
dev-52 2/7/2020 6:06:21 PM 7
dev-52 2/7/2020 6:14:51 PM 8
dev-52 2/7/2020 6:31:23 PM 9
dev-52 2/7/2020 6:47:54 PM 10
dev-52 2/7/2020 7:04:26 PM 11
dev-52 2/7/2020 7:20:58 PM 12
我想返回 first 和 last 之间的差异,计数按 updated_at 排序,最后一个 updated_at where acteename 等于我从不同表中获得的某个名称
IQueryable<Events> list = _DBcontext.Events.GroupBy(p => p.ActeeName)
.Select(g => new
{
acteename = g.Key,
lastupdated = g.OrderByDescending(p => p.UpdatedAt).First(),
firstcount = g.OrderBy(p => p.UpdatedAt).First().Count,
lastcount = g.OrderByDescending(p => p.UpdatedAt).First().Count
})
.Select(x => new { x.acteename,x.lastupdated, diff = x.lastcount - x.firstcount })
.Where(a => a.acteename == item.AppName)
.ToList();
出现以下错误:
不能隐式转换类型
'System.Collections.Generic.List<<anonymous type: string acteename, TestApp.Models.Events lastupdated, int diff>>'到'System.Linq.IQueryable<TestApp.Models.Events>'。显式 存在转换(您是否缺少演员表?)
预期输出:
dev-52 2/7/2020 7:20:58 PM 11
有点卡在这个不确定 LINQ 查询是否正确,任何帮助都会很有用:)
更新:
我运行的确切查询:
var list = from p in _DBcontext.AppProcessCrashEvents
where p.Actee == item.AppGuid
group p by p.Actee
into gList
select new
{
acteenamex = gList.Key,
lastUpdated_at = gList.OrderBy(x => x.UpdatedAt).Last().UpdatedAt,
diff = gList.OrderBy(x => x.UpdatedAt).Last().CrashCount -
gList.OrderBy(x => x.UpdatedAt).First().CrashCount
};
【问题讨论】:
-
显然是
IQueryable<Events> != List<Events>。只需将 IQueryable 更改为 List 即可。 -
@panoskarajohn 你不能“只是”这样做,因为不能有匿名类型的 explicit 声明......另一方面,
var会很好。 -
@AlexeiLevenkov 正确。
-
另外,您可能希望先应用
Where子句,在选择之前过滤结果,然后您只需要一个Select子句 - 只需选择您想要的匿名类型的属性单个Select声明。 -
@RufusL
GroupBy怎么样?