У меня есть следующее выражение:
var rules = rules.OrderBy(rule => (int)rule.RuleType)
.FirstOrDefault( item => item.IsMatch(request.data))
?.Execute(request.data);
Что делает этот кусок кода - он принимает набор правил (которые все реализуют один и тот же интерфейс),
сортирует их по возрастанию порядок, а затем вызывает функцию IsMatch, которую реализует каждое из этих правил - первое «True», которое возвращается из любой функции IsMatch, остановит итерацию и вызовет функцию Execute
.
Если все вернули False, Execute
вызываться не будет.
Объект rules
находится в начале (после OrderBy) a IOrderedEnumerable<IRule>
, а затем изменяется на IEnumerable<IRule>
(возвращается тип FirstOrDefault).
Я выполняю рефакторинг части своего кода, теперь функция isMatch
изменилась на функцию Asyn c.
Я использую. NET 472 и обнаружила, что FirstOrDefaultAsync
, который является в пространстве имен EntityFramework.DynamicLinq
может вызываться только для объектов типа IQueryable
.
Как только я изменяю его на:
var rules = rules.OrderBy(rule => (int)rule.RuleType).ToList().AsQueryable()
.FirstOrDefaultAsync(async item => await item.IsMatchAsync(request.data))
?.Execute(request.data);
Я получаю сообщение об ошибке, что нет перегрузки функции FirstOrDefaultAsyn c, которая принимает бул an (или в данном случае лямбда, которая возвращает логические значения)
Так что мой вопрос - как я могу изменить этот код на асинхронный код?