Как ожидать (в асинхронном методе) запроса linq, связанного с вызовом метода ac # - PullRequest
0 голосов
/ 21 декабря 2018

Я реализую метод Get в API, и я выполняю запрос linq (Linq to Entity) к базе данных:

  var result = db.SomeEntity
             .ToList()
             .Select(a => new {a, Rank(a, key})
             .Where(obj => obj.Rank > 0));

Где метод Rank возвращает целое число на основе некоторого свойства ва.Другими словами, я обертываю объект в новый объект с соответствующим рейтингом.

Поскольку это метод Get в API, было бы неплохо сделать его асинхронным и ожидать запроса linq.Проблема в том, что мне нужно вызывать ToList перед Select, чтобы метод Select не переводился в SQL (для того, чтобы сработал вызов метода Rank), и из-за этого я не могу использовать ToListAsync после функции Where

Например

await (db.Some.....Where(..)).ToListAsync()

Я не уверен, как это сделать.Какие-либо предложения?

1 Ответ

0 голосов
/ 21 декабря 2018

Я не могу использовать ToListAsync после функции Where

Вы все еще можете ждать операции с БД, просто оберните операцию в скобках, чтобы общий результат был корректным типом:

var result = (await db.SomeEntity.ToListAsync())
         .Select(a => new {a, Rank(a, key})
         .Where(obj => obj.Rank > 0));

И наоборот, вы можете выполнить всю операцию в два этапа:

var list = await db.SomeEntity.ToListAsync();
var result = list.Select(a => new {a, Rank(a, key})
                 .Where(obj => obj.Rank > 0));

В любом случае, это одно и то же.Select и Where в этом случае не делают ничего асинхронного, поэтому ждать больше нечего.Ваша операция с БД происходит на .ToList(), а не на .Where().

Примечание. Если вообще , можно выполнить логику Rank() в LINQ-to-Дерево выражений сущностей, которое, вероятно, будет лучшим вариантом в целом.Даже если это усложнит логику, если счет SomeEntity достигнет какого-либо значительного значения, выигрыш в производительности очевиден.

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