6
votes

retour d'un linq où déclaration

J'ai la fonction de liaison suivante

MyLinqToSQLTable.Where(x =>
{ 
    x.objectID == paramObjectID;
}).ToList();


0 commentaires

3 Réponses :


9
votes

Votre première requête est équivalente à celle-ci: xxx

vous manque au mot retour key ici. Il est nécessaire que le corps de la Lambda est un bloc explicite plutôt qu'une expression.

La spécification définit formellement lambda-expression dans la grammaire comme:

lambda-expression :
      fonction anonyme-signature => corps-fonction anonyme

corps anonyme-corps :
    expression
    bloc

L'ancien cas ( expression ) s'applique lorsque le corps ne commence pas par une attelle bouclée gauche. Ce dernier cas ( bloc ) est défini comme une série de déclarations (comme un organisme de méthode). Comme d'autres endroits en C #, des déclarations d'expression dans un bloc sont limitées aux déclarations, aux missions, à l'appel de fonctions, à l'incrément et à décrémenter. Simplement appliquer l'opérateur == à un couple identifiant n'est pas l'expression d'une instruction valide. Le deuxième problème est que lorsque le type de retour d'une méthode (anonyme ou non) n'est pas vide , tous les chemins de code atteignant la fin du bloc doivent renvoyer une valeur. Par conséquent, même si le corps de votre Lambda était syntaxiquement, sans déclaration de retour, votre Lambda serait convertible vers action , et non func que méthode attend.


mise à jour:

Le problème est le retour implicite qui était là quand je viens de faire un comparateur booléen n'est maintenant pas fait. Retour (x.objectid == paramobjectid); n'est pas accepté non plus.

bien sûr, le x => {retour x.Objectid == paramobjectid; } La variante de votre expression Lambda est uniquement possible quand elle est censée être convertie en une méthode anonyme , pas un arbre d'expression . C'est-à-dire qu'une Lambda avec un corps block n'est pas convertible vers expression . C'est pourquoi vous pouvez l'utiliser dans LINQ vers des objets (dans lesquels prend func ) mais vous ne pouvez pas l'utiliser à Linq vers SQL (dans lequel prend expression > ).


1 commentaires

+1 Pour indiquer qu'un Lambda multiligne ne peut pas être utilisé dans LINQ vers SQL ou EF, car il n'est pas convertible à un arbre d'expression.



1
votes

Est-ce que cela fonctionne?

MyLinqToSQLTable.Where(x =>  
{   
    return x.objectID == paramObjectID;  
}).ToList();  


0 commentaires

-1
votes
MyLinqToSQLTable.Where(x =>  
{   
    return x.objectID == paramObjectID;  
}).ToList();  
or
MyLinqToSQLTable.Where(x =>  
{   
    return x.objectID == paramObjectID;  
}).ToArray();

1 commentaires

Il y a déjà deux autres réponses disant la même chose. Cette réponse n'ajoute aucune valeur que ce soit.