entity.ToListAsync (). Где или entity.Where ()? - PullRequest
0 голосов
/ 28 мая 2018

У меня есть проблема, чтобы решить, какой способ лучше всего запросить мой SQL Server на моем WebAPI 2 Backend

Я пытаюсь использовать async / await как можно чаще, но я обнаружил, что когда я возвращаювсей коллекции, асинхронная опция недоступна.

Какой путь будет лучшим?

[ResponseType(typeof(List<ExposedPublisher>))]
[HttpGet]
public async Task<IHttpActionResult> GetPublisher()
{
    var list = new List<PublisherWithMedia>();
    foreach (var publisher in _db.Publisher.Where(e => e.IsDeleted == false))
    {
        var pub = new PublisherWithMedia()
            {
                Id = publisher.Id,
                Name = publisher.Name,
                Mediae = new List<WebClient.Models.Media>()
            };
            foreach (var media in publisher.Media)
            {
                pub.Mediae.Add(ApiUtils.GetMedia(media));
            }
        list.Add(pub);
    }
    return Ok(list);
}

или

[ResponseType(typeof(List<PublisherWithMedia>))]
[HttpGet]
public async Task<IHttpActionResult> GetPublisher()
{
    var list = new List<PublisherWithMedia>();
    var entity = await _db.Publisher.ToListAsync();
    foreach (var publisher in entity.Where(e => e.IsDeleted == false))
    {
        var pub = new PublisherWithMedia()
            {
                Id = publisher.Id,
                Name = publisher.Name,
                Mediae = new List<WebClient.Models.Media>()
            };
            foreach (var media in publisher.Media)
            {
                pub.Mediae.Add(ApiUtils.GetMedia(media));
            }
        list.Add(pub);
    }
    return Ok(list);
}

Операция может потенциально привести кочень большой набор результатов, поэтому имеет смысл фильтровать непосредственно по базе данных, особенно потому, что со временем количество удаленных записей может превысить количество неподтвержденных.Однако, с большим результатом и запросом потомков (Media), также имеет смысл заставить операцию работать асинхронно, так как она должна быть довольно трудоемкой.К сожалению, в этом контексте нет асинхронного Where().

Или есть третий способ, о котором я не знаю?

1 Ответ

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

Вы можете иметь лучшее из обоих миров: отфильтровать в базе данных и асинхронно выполнить запрос:

var publishers = await _db.Publisher
    .Where(e => !e.IsDeleted)
    .ToListAsync();

При этом в зависимости от того, что делает ApiUtils.GetMedia(media), вы можете даже выполнить проекцию назапрос:

var publishers = await _db.Publisher
    .Where(e => !e.IsDeleted)
    .Select(e => new PublisherWithMedia()
    {
        Id = e.Id,
        Name = e.Name,
        Mediae = e.Mediae.Select(m => ApiUtils.GetMedia(m)).ToList()
    };
    .ToListAsync();
...