Оператор 'await' может использоваться только внутри асинхронного лямбда-выражения.Попробуйте пометить это лямбда-выражение модификатором async - PullRequest
0 голосов
/ 15 февраля 2019

В следующем запросе LinQ для получения номера телефона я вызываю другой асинхронный метод GetAspNetUserPhoneNumberByAccountId, который выдает эту ошибку

Ошибка CS4034 Оператор 'await' может использоваться только внутри асинхронной лямбдывыражение.Попробуйте пометить это лямбда-выражение модификатором async.

Кто-нибудь имеет представление об этом?

 var fullAppointment = await Task.Run(() => Context.AppointmentDetail
     .Where(u =>
     u.StartDateTime >= startdatetime
      && u.EndDateTime <= enddatetime

      )
       .Select(x => new Contracts.CalenderModel2()
        {
          StatusId = (Contracts.Enum.EnumWOStatus)x.Status,
          FName = x.Appointment != null ? x.Appointment.Customer.Account.FName : "",
          LName = x.Appointment != null ? x.Appointment.Customer.Account.LName : "",
          **PrimaryPhone = x.Appointment != null ?
          (await _userRepository.GetAspNetUserPhoneNumberByAccountId( x.Appointment.Customer.AccountId))**
          : "",
          Year = x.Appointment != null && x.Appointment.Vehicle != null ? x.Appointment.Vehicle.MakeYear.Year : 0,
          Make = x.Appointment != null && x.Appointment.Vehicle != null ? x.Appointment.Vehicle.VehicleMaker.MakerName : "",
          Model = x.Appointment != null && x.Appointment.Vehicle != null ? x.Appointment.Vehicle.VehicleModel.Model : "",
          AppointmentId = x.AppointmentId,
          JobEndDateTime = x.EndDateTime,
          JobStartDateTime = x.StartDateTime,
          ColorCategory = x.AppointmentType.ColorCategory,

          SalesRepersentativeUserId =
(x.Appointment != null && x.Appointment.Customer.CustomerBillTo.Count > 0)
              ? x.Appointment.Customer.CustomerBillTo.FirstOrDefault().BillToId : Guid.Empty,

          FullAppointmentDetail = new Contracts.FullAppointmentDetail
          {
            BayId = x.BayId,
            BayName = x.WorkArea != null ? x.WorkArea.BayName : "",
            WorkTypeId = x.WorkTypeId,
            WorkTypeName = x.WorkType != null ? x.WorkType.WorkTypeName : "",
            JobId = x.Appointment != null && x.Appointment.Job != null ? x.Appointment.Job.Id : Guid.Empty,
            JobIdInt = x.Appointment != null && x.Appointment.Job != null ? x.Appointment.Job.JobIdInt : 0,
            AssigneeUserId = x.AssigneeUserId,
            WorkOrderId = x.WorkOrders.FirstOrDefault() != null ? x.WorkOrders.FirstOrDefault().Id : Guid.Empty
          }

        })
        .ToList());

Определение GetAspNetUserPhoneNumberByAccountId дано ниже

public async Task<string> GetAspNetUserPhoneNumberByAccountId(Guid accountId)
{
  var phone = await Task.Run(() => _Context.Account.Where(ac => ac.Id.Equals(accountId))
   .Join(_Context.AspNetUsers, ac => ac.AspNetUserId, u => u.Id, (ac, u) => new 
   {
     PhoneNumber = u.PhoneNumber,

   }).FirstOrDefault());

  return phone!=null?phone.ToString():"";
}

1 Ответ

0 голосов
/ 15 февраля 2019

Я согласен с парнями в комментариях, что вам не нужно использовать асинхронный метод в этом запросе.Дополнительно этот запрос не будет оптимизирован.Для каждого элемента в состоянии Где вы будете делать запрос в БД.Если у вас много данных, производительность БД снизится.Я думаю, что в этом случае гораздо лучше сделать это 2 запроса к БД.Для получения AppointmentDetail и другой запрос для получения всех учетных записей.И оба запроса с асинхронным вызовом.И после этого объедините его с вашим Contracts.CalenderModel2 классом.

Он будет более читабельным и будет работать быстрее.И не используйте Task.Run ();

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