2013-09-27 1 views
1

Nous nous attendons à ce que LINQ to Entities soit capable de gérer une fonction de valeur absolue. Il semble que cela ne peut pas traduire le linq en sql. Nous utilisons .net 3.5. Existe-t-il un autre moyen d'exprimer cette requête pour qu'elle fonctionne avec Linq to Entities? La valeur absolue que nous utilisons fait partie de la table entity/DB. Voir l'exemple de code ci-dessous.LINQ to Entities ne reconnaît pas la méthode 'Single Abs (Single)' méthode

ListItemIds = sessionDB.ListItems 
.Where(x => x.ListItemId >= x.List.StartId && x.ListItemId <= x.List.EndId) 
.Where(x => (x.Dr != null)||(Math.Abs(x.Dr.Value) >= rangeDB)) 
.Select(x => x.ListItemId).ToList(); 
+0

Je pense que vous avez une petite logique Erro r non lié à votre 'Math.Abs', la clause seccond where doit être" * .Where (x => (x.Dr! = null) ** && ** (Math.Abs ​​(x.Dr.Value)> = rangeDB)) * "En utilisant' || 'vous pourriez obtenir une référence nulle sur' x.Dr.Value' (en supposant que 'Math.Abs' a fonctionné, la réponse de pswg est probablement la solution) –

Répondre

3

En termes mathématiques, |x| >= y est vrai si l'une ou x >= y-x >= y (ce qui équivaut à x <= -y), de sorte que vous pouvez simplement vérifier les valeurs positives et négatives de Dr.Value.

Cependant, Scott a raison; La façon dont vous vérifiez null est également fausse. Utilisez cette option si vous ne souhaitez que les enregistrements où la Dr propriété ne nulle etDr.Value se situe dans la fourchette prévue (c.-à-sont exclus de null):

ListItemIds = sessionDB.ListItems 
    .Where(x => x.ListItemId >= x.List.StartId && x.ListItemId <= x.List.EndId) 
    .Where(x => (x.Dr != null)&&((x.Dr.Value >= rangeDB)||(x.Dr.Value <= -rangeDB))) 
    .Select(x => x.ListItemId).ToList(); 

Ou cela pour les enregistrements où Drest- null ouDr.Value se situe dans la fourchette prévue (c.-à-nuls de inclus):

ListItemIds = sessionDB.ListItems 
    .Where(x => x.ListItemId >= x.List.StartId && x.ListItemId <= x.List.EndId) 
    .Where(x => (x.Dr == null)||(x.Dr.Value >= rangeDB)||(x.Dr.Value <= -rangeDB)) 
    .Select(x => x.ListItemId).ToList(); 
+0

Je pense que l'OP a fait une erreur sur la vérification null, il devrait être '&&' pas un '||', je dis seulement parce que cela change légèrement la 2ème partie (cela nécessiterait un jeu de parenthèses supplémentaire). –

+0

@ScottChamberlain Vous avez raison! J'ai raté ça, merci. –

Questions connexes