2014-09-19 2 views
1

J'ai essayé la requête LINQ ci-dessous dans Linqer cela fonctionne très bien mais il donne l'erreur ci-dessous pendant que j'ai essayé avec C#LINQ to Entities ne reconnaît pas la méthode Double Round (Double, Int32, System.MidpointRounding) méthode

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) 
      }; 

l'erreur est

"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." 

Répondre

5

tout ce qui est pris en charge dans la BCL a un équivalent direct dans SQL. Étant donné que c'est la dernière partie de la requête, l'approche la plus simple serait d'écrire simplement une requête qui récupère toutes les données dont vous avez besoin sans arrondi etc, puis transformez ces données dans votre format préféré en utilisant une requête locale:

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; 

en utilisant AsEnumerable() efficacement change juste le type de compilation ... afin que l'appel Select est Enumerable.Select au moyen d'un délégué plutôt que Queryable.Select l'aide d'un arbre d'expression.

J'espère que vous pourriez faire la transformation finale beaucoup plus simple que votre approche actuelle si - des choses comme (Double)(Double) ne sont pas vraiment nécessaires ... et chaque fois que vous convertir double-decimal ou vice versa, vous devriez question de savoir si c'est nécessaire ou souhaitable ... il est généralement préférable de s'en tenir à soit point flottant binaire ou point flottant décimal, plutôt que de les mélanger.

Questions connexes