【问题标题】:Selecting single element from each group that cointains maximum DateTime value从包含最大 DateTime 值的每个组中选择单个元素
【发布时间】:2018-10-27 12:25:26
【问题描述】:

型号:

public class ReferenceParameterHistory
{
    [Key]
    public int IDReferenceParameterHistory { get; set; }
    public double Value { get; set; }
    public string Value_S { get; set; }
    public DateTimeOffset CreatedAt { get; set; }
    [Required]
    public bool IsStable { get; set; }

    public int? IDReference { get; set; }
    public Reference Reference { get; set; }

    [Required]
    public int IDParameterTemplate { get; set; }
    public ParameterTemplate ParameterTemplate { get; set; }
}

我在 ASP.NET 核心控制器中的代码:

            [HttpGet]
    public async Task<IActionResult> GetReferenceParameterHistory(int? IDparameterTemplate,
                                                                  int? IDreference,
                                                                  DateTimeOffset? startDate,
                                                                  DateTimeOffset? endDate,
                                                                  bool latestOnly)
    {
        try
        {
            IQueryable<ReferenceParameterHistory> query = _context.ReferenceParameterHistory.OrderByDescending(rph => rph.IDReferenceParameterHistory);
            if (IDparameterTemplate != null && IDparameterTemplate > 0)
                query = query.Where(rph => rph.IDParameterTemplate == IDparameterTemplate);
            if (IDreference != null && IDreference > 0)
                query = query.Where(rph => rph.IDReference == IDreference);
            if (startDate != null)
                query = query.Where(rph=> rph.CreatedAt >= startDate);
            if (endDate != null)
                query = query.Where(rph => rph.CreatedAt <= endDate);
            if (latestOnly)
            {
                // I tried this but it doesnt compile and I don't have idea how to solve this ....

                //query = (from rph in query
                //         group rph by rph.IDParameterTemplate
                //            into groups
                //            where groups.Max(rph => rph.CreatedAt)
                //         select groups.Key);
            }


            var referenceParameterHistory = await query.AsNoTracking().ToListAsync();
            if (referenceParameterHistory.Any())
                return new ObjectResult(referenceParameterHistory);

            return new NotFoundResult();
        }
        catch (Exception ex)
        {
            _logger.LogError(ex.Message);
            return new StatusCodeResult(500);
        }
    }

我有一个基于 ReferenceParameterHistory 模型类的数据库表。我想按IDParameterTemplate 对从该表中提取的记录进行分组,并从每个组中提取在CreatedAt 列中具有最高值的记录(最新记录)。所以每个组都包含许多记录,但我只需要在CreatedAt 列中获取最大值。结果应该是ReferenceParameterHistoryIEnumerable,因为我将该查询存储在IQueryable 变量中,然后将其发送到SQL Server 以处理查询。我的示例中的注释代码正是我尝试过的,但我不知道该怎么做。

我该如何解决这个问题?

【问题讨论】:

    标签: linq entity-framework-core ef-core-2.0


    【解决方案1】:

    您在 lambda 中重用了变量 rph。

    How to select only the records with the highest date in LINQ

    查询 =(来自查询中的 rph
    通过 rph.IDParameterTemplate 将 rph 分组到 g
    选择 g.OrderByDescending(t=>t.CreatedAt).FirstOrDefault());

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-09
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多