Маркировка лямбда-выражения с помощью асинхронного ключевого слова - PullRequest
1 голос
/ 25 апреля 2019

У меня есть функция с именем GetParentViewModel, как показано ниже, которая преобразует класс родительской модели в ParentViewModel, чтобы его можно было отправить в представление.

   public class Parent
   {
        public int ParentId { get; set; }
        public string ParentName { get; set; }
        public IEnumerable<Child> children{ get; set; }
   }

   public class Child
   {
        public int ChildId { get; set; }
        public string ChildName { get; set; }
        private IEnumerable<Friend> friends { get; set; }
        public IEnumerable<Hobby> hobbies { get; set; }
   }

   public async Task<List<Hobby> GetHobbies(int childId)
   {
       return await..
   }

   public async Task<List<Friend> GetFriends(int childId)
   {
       reutrn await..
   }

   public async Task<ParentViewModel> GetParentViewModel(Parent parentModel)
   {
      return new ParentViewModel() 
      {
         ParentId = parentModel.ParentId,
         ParentName = parentModel.ParentName,
         children = parentModel.children.Select(item => new ChildViewModel()
         {
             ChildId = item.ChildId,
             ChildName = item.ChildName,
             hobbies = await GetHobbies(item.ChildId),
            friends = await GetFriends(item.ChildId)
          }); 
       };
   }

когда я пытаюсь вызвать асинхронные функции для GetHobbies и GetFriends, внутри GetParentViewModel я получаю сообщение об ошибке

   CS4034: The ‘await’ operator can only be used within an async lambda expression. Consider marking this lambda expression with the async modifier.

Я пробовал все виды вещей, пытался пометить как асинхронные непосредственно перед «Select (item => ..»), но безуспешно, имел ключевое слово await сразу после «children = await parentModel», но, похоже, оно не работает. Может кто-нибудь помочь ..

Я заработал, написав отдельную асинхронную функцию для получения дочерних элементов, но не выше. Любые предложения, пожалуйста

спасибо.

1 Ответ

2 голосов
/ 25 апреля 2019

Обновление: Я бы порекомендовал рефакторинг на что-то вроде этого:

    public async Task<ParentViewModel> GetParentViewModel(Parent parentModel)
    {
        var childrens = new List<ChildViewModel>();
        foreach (var item in parentModel.children)
        {
            var hobbies = await GetHobbies(item.ChildId);
            var friends = await GetFriends(item.ChildId);

            var child = new ChildViewModel
            {
                ChildId = item.ChildId,
                ChildName = item.ChildName,
                hobbies = hobbies,
                friends = friends
            };

            childrens.Add(child);
        }

        return new ParentViewModel
        {
            ParentId = parentModel.ParentId,
            ParentName = parentModel.ParentName,
            children = childrens
        };
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...