2011-12-16 2 views
2

Je n'arrive pas à comprendre comment comparer les valeurs booléennes dans une expression C# lambda pour EF4. J'ai essayé:Expression lambda compare booléen comme faux résultats dans NotSupportedException

cl.Where(c => c.Received == false); 

et ceci:

cl.Where(c => !c.Received); 

et ceci:

cl.Where(c => c.Received.Equals(false)); 

mais je continue à obtenir cette erreur:

Exception Details: System.NotSupportedException: Unable to create a constant value 
of type 'System.Object'. Only primitive types ('such as Int32, String, and Guid') 
are supported in this context. 

Après avoir passé une bonne quantité de temps à la recherche de cela, il me manque encore quelque chose g. Je suis assez nouveau à Lambdas donc pointers serait apprécié.

Edit2: plus de code re: comment

int bar = 42; 
var cl = db.foo.Where(c => c.baz.Equals(bar)); 
//codez (just an if statement) 
cl.Where(c => c.Received == false).OrderByDescending(c => c.dateAdded); 

Voilà. Même si je retire le orderby il ne fonctionne toujours pas

Edit3:

Solution:

int bar = 42; 
var cl = db.foo.Where(c => c.baz == bar); 
cl.Where(c => c.Received == false).OrderByDescending(c => c.dateAdded); 
+4

L'erreur est probablement dans l'autre partie de votre déclaration. Pourriez-vous poster le reste de la ligne à partir de laquelle vous faites un appel, et quelques autres cadres de la trace de la pile? – dasblinkenlight

+0

Ce que dit @dasblinkenlight est correct. Les deux premières méthodes fonctionneront bien pour comparer les booléens dans EF 4 –

+0

merci pour la réponse rapide @dasblinkenlight J'ai ajouté une partie du code environnant et la trace de la pile – Eonasdan

Répondre

3

La question est plus probable dans la ligne c.baz.Equals(bar). Si vous modifiez à

var cl = db.foo.Where(c => c.baz.Equals(bar)).ToList(); 

vous devriez voir l'exception jetée sur cette ligne, parce que vous obligez évaluation de la IQueryable<T>.

Au lieu de comparer les objets, vous devez comparer leurs papiers d'identité, comme ceci:

(modifié pour tenir compte de la conversation dans les commentaires et les modifications à l'OP)

var cl = db.foo.Where(c => c.baz == bar.id); 
+0

Vous pouvez comparer des objets dans linq? Si c'est de la même instance du datacontext. – Niklas

+0

@dasblinkenlight édité mon code à nouveau.Bar est une variable int. Cela affecte-t-il votre code? – Eonasdan

+0

@Niklas Jusqu'à ce que vous le convertissiez en 'IEnumerable ', ce n'est pas encore LINQ: c'est dans le monde de l'EF, où 'IQueryable ' est traduit en SQL. – dasblinkenlight

0

Quel est le type de Received ? Where close nécessite un prédicat (une fonction qui renvoie booléen) afin d'agir sur chaque élément de la liste et de retourner ceux qui satisfont la condition. Du message d'erreur, il semble le Received dans le type non primitif. Vous devez le convertir en booléen si vous connaissez son booléen.