istudent Ответов: 1

Ошибка: не поддерживается исключение в запросе linq при вызове метода для установки свойств в инструкции linq


Привет,

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

Что я уже пробовал:

private static double CalculateAvgDayFromDates(DateTime date, DateTime productionStartDate)
        {
            return (Convert.ToDateTime(date.ToShortDateString()) - Convert.ToDateTime(productionStartDate.ToShortDateString())).TotalDays + GetPercentageOfDay(date.TimeOfDay);
           
        }
        public static void GetDirectorDetails()
        {
            try
            {
                var sdt = new DateTime(2018, 2, 3);
                var edt = new DateTime(2019, 2, 1);

                using (var db = new MyDbContext())
                {
                    var ManagerDetails = from p in db.Projects
                                          let projHOurs = db.ProjectHours.Where(ph => ph.ProjectID == p.ID).Sum(h => h.DayHours)
                                          //let lDate = CalculateAvgDayFromDates(p.ReadyToLaunchDate.Value, p.ProductionStartDate.Value)
                                          //let sLDate = CalculateAvgDayFromDates(p.ProductionStartDate.Value.AddDays(6), p.ProductionStartDate.Value)
                                          where (p.ProductionStartDate > sdt && p.ProductionStartDate <= edt)
                                          where (p.ProductionCompleteDate != null && p.ProductType == 1 && p.Active)
                                         
                                          select new
                                          {
                                              Manager = p.Manager,
                                              SalesEmployee = p.SalesEmployee,
                                              StoreNumber = p.StoreNumber,
                                              LaunchDate = CalculateAvgDayFromDates(p.ReadyToLaunchDate.Value, p.ProductionStartDate.Value),
                                              SoftLaunchDate = CalculateAvgDayFromDates(p.ProductionStartDate.Value.AddDays(6), p.ProductionStartDate.Value),
                                              totalWorkedHours = projHOurs

                                          };

                    var Query = from d in directorDetails
                                  group d by d.director into g
                                  select new
                                  {
                                      manager = g.Key,
                                      storeCounts = g.Count(),
                                      avgWorkedHours = g.Average(x => x.totalWorkedHours),
                                      avgLaunchDays = g.Average(x => x.LaunchDate),
                                      avgSoftLaunchDays = g.Average(x => x.SoftLaunchDate)
                                  };
                   
                    foreach (var d in Query)
                    {
                        System.Diagnostics.Debug.WriteLine($"dir:{d.manager}, storeCounts: {d.storeCounts}, avgLaunchDays: {d.avgLaunchDays}, avgSoftLaunchDays:{d.avgSoftLaunchDays}, avgWorkedHours: {d.avgWorkedHours}");
                      
                    }
                }
            }
            catch (Exception ex)
            {

                string s = ex.Message;
                System.Diagnostics.Debug.WriteLine(s);
            }
        }

1 Ответов

Рейтинг:
12

Richard Deeming

Entity Framework не знает, как преобразовать ваш CalculateAvgDayFromDates метод для SQL-запроса.

Вам нужно будет извлечь записи в память, прежде чем выполнять это вычисление.

var managerQuery = from p in db.Projects
                   let projHOurs = db.ProjectHours.Where(ph => ph.ProjectID == p.ID).Sum(h => h.DayHours)
                   where (p.ProductionStartDate > sdt && p.ProductionStartDate <= edt)
                   where (p.ProductionCompleteDate != null && p.ProductType == 1 && p.Active)
                   select new
                   {
                       p.Manager,
                       p.SalesEmployee,
                       p.StoreNumber,
                       p.ReadyToLaunchDate,
                       p.ProductionStartDate,
                       projHOurs,
                   };

var ManagerDetails = from r in managerQuery.AsEnumerable()
                     select new
                     {
                         r.Manager,
                         r.SalesEmployee,
                         r.StoreNumber,
                         LaunchDate = CalculateAvgDayFromDates(r.ReadyToLaunchDate.Value, r.ProductionStartDate.Value),
                         SoftLaunchDate = CalculateAvgDayFromDates(r.ProductionStartDate.Value.AddDays(6), r.ProductionStartDate.Value),
                         totalWorkedHours = r.projHOurs,
                     };

То AsEnumerable() вызов заставляет следующие методы LINQ выполняться в памяти, а не пытаться преобразовать их в SQL.


istudent

Благодарю вас сэр