LINQ to Entities не распознает метод Double Round(Double, Int32, System.MidpointRounding)

Я попробовал приведенный ниже LINQ Query в Linqer, он работает нормально, но выдает ошибку ниже, когда я пытался с C#

from IHeal_Mnt_Tickets in iHealEntities.iHeal_Mnt_Tickets
    where
        Tickets.Active == 1 &&
        Tickets.MntID == 1 &&
        Tickets.InsertedOn >= fromdate && 
        Mnt_Tickets.InsertedOn <= todate &&
        (new string[] { "Resolved", "Assigned" }).Contains(Tickets.status)
        group Tickets by new {
            Tickets.Instance
        } into g
            select new {
              Instance = g.Key.Summus_Instance,
              Assigned = (Int64?)g.Count(p => p.iHealID != null),
              resolved = (System.Int64?)g.Sum(p => (p.status == "Resolved" ? 1 : 0)),
              domain = (System.Int64?)g.Sum(p => (p.status == "Assigned" ? 1 : 0)),
              iHeal_Closure = (Decimal?)Math.Round((Double)(Double)g.Sum(p => (p.iHeal_Cur_status == "Resolved" ? 1 : 0)) * 1.0 / (Double)g.Count(p => p.iHealID != null) * 100, 2, MidpointRounding.AwayFromZero)
            };

Ошибка

"LINQ to Entities does not recognize the method 'Double Round(Double, Int32, System.MidpointRounding)' method, and this method cannot be translated into a store expression."

1 ответ

Не все, что поддерживается в BCL, имеет прямой эквивалент в SQL. Учитывая, что это последняя часть запроса, самый простой подход - написать запрос, который извлек бы все необходимые данные без округления и т. Д., А затем преобразовать эти данные в предпочитаемый формат, используя локальный запрос:

var dbQuery = from item in source
              where filter
              select projection;
// The AsEnumerable() part is key here
var localQuery = from item in dbQuery.AsEnumerable()
                 select complicatedTransformation;

С помощью AsEnumerable() эффективно просто изменяет тип времени компиляции... так что Select вызов Enumerable.Select используя делегат, а не Queryable.Select используя дерево выражений.

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

Другие вопросы по тегам