web-dev-qa-db-fra.com

Requête Linq ou expression Lambda?

J'utilise Entity Framework dans mon application Web ASP.NET, C #. Si je dois sélectionner un enregistrement à partir de DataBase (dans Data Access Layer), quelle méthode dois-je utiliser? Requête Linq ou une expression Lambda?

Par exemple:-

//Linq        
var result = from a in db.myTable.Take(1) where a.Id == varId  select a;
return result.First();

//Lambda
return db.myTable.FirstOrDefault(a => a.Id == varId);

Y a-t-il un moyen privilégié dans ce scénario ou un avantage sur l'autre?

9
Nalaka526

Query Expression est compilé dans Method Expression (expression Lambda). Par conséquent, il ne devrait y avoir aucune différence dans votre code même si vous accédez à First et FirstOrDefault qui se comporteraient différemment.

Voir: Syntaxe de requête et syntaxe de méthode dans LINQ (C #)

et Expressions de requête LINQ (Guide de programmation C #)

Lors de la compilation, les expressions de requête sont converties en appels de méthode à un opérateur de requête standard, conformément aux règles définies dans la spécification C #. Toute requête pouvant être exprimée à l'aide de la syntaxe de requête peut également l'être à l'aide de la syntaxe de méthode. Cependant, dans la plupart des cas, la syntaxe de la requête est plus lisible et concise.

15
Habib

La syntaxe de requête Linq est juste un sucre de syntaxe pour les méthodes d'expression. Toute requête Linq compilée dans des méthodes d'expression. Btw votre première requête:

var query = from a in db.myTable.Take(1) 
            where a.Id == varId  
            select a;
return query.First();

Est équivalent à

return db.myTable.Take(1).Where(a => a.Id == varId).First();
5
Sergey Berezovskiy

Vos deux essais utilisent Linq.

Le premier prend un enregistrement et vérifie si l'identifiant correspond.

Le second prend le premier enregistrement où l'identifiant correspond.

C'est une différence.

3
nvoigt

Je suppose que le résultat est le même. Lambda est juste un peu plus confortable. Si vous avez besoin d'un résultat avec une seule table, l'expression lambda est très rapide et lisible.

0
Ipad

Chaque expression de requête peut être exprimée sous forme de code C # en utilisant des appels aux opérateurs de requête en tant que méthodes d'extension. Mais le contraire n'est pas vrai. seul un petit sous-ensemble des opérateurs de requête standard peut être utilisé comme mot-clé dans les expressions de requête. En d'autres termes, les expressions de requête ont certaines limitations que le mécanisme d'appel de méthode n'a pas:

  1. Certains opérateurs de requête n'ont tout simplement pas d'équivalent d'expression de requête C #, par exemple. ToArray ().
  2. Nous ne pouvons pas utiliser toutes sortes de surcharges dans les expressions de requête de C #. Par exemple. il y a une surcharge de Select () qui attend l'index de l'objet actuellement itéré; vous ne pouvez pas appeler cette surcharge dans une expression de requête.
  3. Nous ne pouvons pas utiliser l'instruction lambdas dans les expressions de requête. - C’est la raison pour laquelle les initialiseurs d’objet et de collection ont été introduits dans le langage C #.
0
Nico