walid youssef Ответов: 1

Aspnetcore 1.1 group by и count получает объект


I have the following table:

<pre lang="c++">Cans
 
Id: int 
HospitalId: (Foreign Key) int 
operDt: DateTime


Мне нужно посчитать общее количество строк, банки, сгруппированные по hospitalId

чтобы получить аналогичный результат без Id

скриншот[^]

Что я уже пробовал:

Хранилище :

public Task GetCansMin(DateTime startdt, DateTime enddt)
            {
                using (appContext)
                {
                    return appContext.Cans.Where(c => c.OperDt > startdt && c.OperDt < enddt).GroupBy(c => c.HospitalId)
                          .Select(g => new
                          {
                              NumberofCancelled = g.Count() 
                          }).ToArrayAsync();
                         
                };
            }


Контроллер:



[HttpGet("bydate")]
            public IActionResult GetCanMin(DateTime startdt, DateTime endd)
            {
                var res = this._unitOfWork.Cans.GetCansMin(startdt, endd);
                return Ok(res);
            }


При передаче запроса с почтальоном:

http://localhost:56964/api/cansdatas/bydate?startdt=2016-01-01&enddt=2016-12-31


вместо получения массива результатов я получаю пустой объект....
Не могли бы вы помочь?

1 Ответов

Рейтинг:
2

Richard Deeming

Ты возвращаешь а Task, а не результаты этого Task.

Вы также избавляетесь от DbContext до того, как Task завершилось.

(В имени параметра действия также отсутствует буква "т", но я не уверен, что это просто опечатка в вашем вопросе.)

Попробуйте что-нибудь вроде этого:

public async Task<object> GetCansMin(DateTime startdt, DateTime enddt)
{
    using (appContext)
    {
        return await appContext.Cans
            .Where(c => c.OperDt > startdt && c.OperDt < enddt)
            .GroupBy(c => c.HospitalId)
            .Select(g => new
            {
                NumberofCancelled = g.Count() 
            })
            .ToArrayAsync();
                         
    }
}

[HttpGet("bydate")]
public async Task<IActionResult> GetCanMin(DateTime startdt, DateTime enddt)
{
    var res = await this._unitOfWork.Cans.GetCansMin(startdt, enddt);
    return Ok(res);
}

NB: Так как вы храните DbContext в полевых условиях я был бы склонен удалить using (appContext) блоки из ваших методов, и пусть ваш класс unit-of-work реализует IDisposable вместо. Затем вы можете зарегистрировать этот класс для удаления после каждого запроса:
Четыре способа избавиться от IDisposables в ASP.NET сердечник[^]