Как создать асинхронный метод в веб-API asp.net - PullRequest
0 голосов
/ 04 ноября 2018

Мне нужно получить данные из моей базы данных с помощью веб-API. Ниже приведен код того, как я его реализую.

[HttpGet]
[Authorize]
[Route("api/getproperties")]
public async Task<List<Property>> GetProperties()
{
    using(var db = new ApplicationDbContext())
    {
        var properties = await (from p in db.Properties
                        join pt in db.PropertyTypes
                        on p.PropertyTypeId equals pt.PropertyTypeId
                        select new
                        {
                            PropertyId = p.PropertyId,
                            PropertyName = p.PropertyName,
                            Owner = p.Owner,
                            Cluster = p.Cluster,
                            PropertyNumber = p.PropertyNumber,
                            RegionCode = p.RegionCode,
                            ProvinceCode = p.ProvinceCode,
                            MunicipalCode = p.MunicipalCode,
                            BarangayCode = p.BarangayCode,
                            DateAdded = p.DateAdded,
                            DateModified = p.DateModified,
                            PropertyTypeId = p.PropertyTypeId,
                            PropertyType = p.PropertyType,
                            Type = pt.Type
                        }
                                ).ToList()
                                .Select(x => new Property
                                {
                                    PropertyId = x.PropertyId,
                                    PropertyName = x.PropertyName,
                                    Owner = x.Owner,
                                    Cluster = x.Cluster,
                                    PropertyNumber = x.PropertyNumber,
                                    RegionCode = x.RegionCode,
                                    ProvinceCode = x.ProvinceCode,
                                    MunicipalCode = x.MunicipalCode,
                                    BarangayCode = x.BarangayCode,
                                    DateAdded = x.DateAdded,
                                    DateModified = x.DateModified,
                                    PropertyTypeId = x.PropertyTypeId,
                                    PropertyType = x.PropertyType,
                                    Type = x.Type
                                }).ToListAsync();

        return properties;
    }
}

Если я не использую «async Task>» и удаляю «.ToListAsync ()» и «await» в начале, я не получаю ошибок. Но с этим функция больше не будет асинхронной. Можете ли вы показать мне, как это правильно? Спасибо.

1 Ответ

0 голосов
/ 04 ноября 2018

Когда вы используете ToList() на IQueryable, асинхронность исчезает, поскольку данные загружаются в память синхронно.

Затем вы пытаетесь вызвать ToListAsync на IEnumerable вместо IQueryable.

Ваш код должен выглядеть следующим образом:

public async Task<List<Property>> GetProperties()
{
    using(var db = new ApplicationDbContext())
    {
        var properties = await (from p in db.Properties
                          join pt in db.PropertyTypes
                          on p.PropertyTypeId equals pt.PropertyTypeId
                          select new Property()
                          {
                              PropertyId = p.PropertyId,
                              PropertyName = p.PropertyName,
                              Owner = p.Owner,
                              Cluster = p.Cluster,
                              PropertyNumber = p.PropertyNumber,
                              RegionCode = p.RegionCode,
                              ProvinceCode = p.ProvinceCode,
                              MunicipalCode = p.MunicipalCode,
                              BarangayCode = p.BarangayCode,
                              DateAdded = p.DateAdded,
                              DateModified = p.DateModified,
                              PropertyTypeId = p.PropertyTypeId,
                              PropertyType = p.PropertyType,
                              Type = pt.Type
                          }).ToListAsync();

        return properties;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...