Изменение выражения с syn c на асинхронный - PullRequest
0 голосов
/ 15 марта 2020

У меня есть следующее выражение:

    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 (или в данном случае лямбда, которая возвращает логические значения)

Так что мой вопрос - как я могу изменить этот код на асинхронный код?

1 Ответ

0 голосов
/ 15 марта 2020

Использование библиотеки System.Linq.Asyn c и при условии, что класс Rule содержит методы public Task<bool> IsMatchAsync(string arg) и public Task ExecuteAsync(string arg):

var matchedRule = await rules.ToAsyncEnumerable()
    .OrderBy(rule => (int)rule.RuleType)
    .FirstOrDefaultAwaitAsync(async item => await item.IsMatchAsync(request.data));
if (matchedRule != null) await matchedRule.ExecuteAsync(request.data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...