【问题标题】:LINQ how to return last date and difference between first and last countLINQ如何返回最后一个日期和第一个和最后一个计数之间的差异
【发布时间】: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

我想返回 firstlast 之间的差异,计数按 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&lt;TestApp.Models.Events&gt;'。显式 存在转换(您是否缺少演员表?)

预期输出:

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&lt;Events&gt; != List&lt;Events&gt;。只需将 IQueryable 更改为 List 即可。
  • @panoskarajohn 你不能“只是”这样做,因为不能有匿名类型的 explicit 声明......另一方面,var 会很好。
  • @AlexeiLevenkov 正确。
  • 另外,您可能希望先应用 Where 子句,在选择之前过滤结果,然后您只需要一个 Select 子句 - 只需选择您想要的匿名类型的属性单个 Select 声明。
  • @RufusL GroupBy 怎么样?

标签: c# sql linq .net-core


【解决方案1】:

人们可以在一开始就应用过滤器。使用group byinto,然后最后选择您需要的。由于它创建了一个匿名对象,因此最好以 'var` 开头。

已编辑:获取内存中的数据,然后应用group by 以避免在与数据库端分组映射时出现任何问题。

var list =  (from p in _DBcontext.Events
            where p.acteename == item.AppName select p).ToList();

var fList = (from p in list 
            group p by p.acteename
            into gList
            select new
            {
               acteenamex = gList.Key,
               lastUpdated_at = gList.OrderBy(x => x.updated_at).Last().updated_at,
               diff = gList.OrderBy(x => x.updated_at).Last().count - 
                                      gList.OrderBy(x => x.updated_at).First().count
            }).ToList();

【讨论】:

  • @Sam 让我们将查询分成两部分。 1) var list = (from p in _DBcontext.Events where p.acteename == item.AppName).ToList(); 然后申请group by
【解决方案2】:

您可以先按AppGuid 过滤列表,然后对其进行排序,然后将其转换为列表。现在,在新变量中使用此列表以从中获取您需要的记录。

var gList = _DBcontext.AppProcessCrashEvents
        .Where(x => x.Actee == item.AppGuid)
        .OrderByDescending(p => p.UpdatedAt)
        .ToList();

var result = new Events
{
    Actee = gList[0].Actee,
    UpdatedAt = gList[0].UpdatedAt,
    CrashCount = gList[0].CrashCount - gList[gList.Count - 1].CrashCount
};

我希望这就是你要找的。​​p>

【讨论】:

    猜你喜欢
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多