Выбор одного элемента из каждой группы, которая содержит максимальное значение DateTime - PullRequest
0 голосов
/ 17 мая 2018

модель:

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. Результат должен быть IEnumerable из ReferenceParameterHistory, поскольку я сохраняю этот запрос в переменной IQueryable и затем отправляю его на SQL Server для обработки запроса. Комментированный код в моем примере - это то, что я пробовал, но я не знаю, как это сделать.

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 18 мая 2018

Вы повторно использовали переменную rph внутри лямбды.

Как выбрать только записи с самой высокой датой в LINQ

query = (от rph в запросе
сгруппировать rph по rph.IDParameterTemplate в g
select g.OrderByDescending (t => t.CreatedAt) .FirstOrDefault ());

...