2010-01-26 6 views
2

Dans les deux déclarations, j'essaie de récupérer l'ID de la catégorie qui a le nom spécifié dans la variable;Quelle instruction LINQ est la meilleure et pourquoi?

Les deux fonctionnent bien. Quelle est la différence et laquelle est la meilleure?

string name = "Progreammers"; 

var categoryID = from c in DataContext.Categories 
          where c.Name == name 
          select c.CategoryID; 

var categoryID = 
    DataContext.Categories.Single(c => c.Name == name).CategoryID; 

EDIT: Il n'y a qu'un seul Nom (champ) pour chaque CategoryID (champ) dans le tableau.

+0

le type de categoryID sera différent dans votre exemple de code – Fredou

+0

sûr qu'il est, dans DB est Bigint, dans le code, il est long. mais je ne peux pas comprendre ce que tu veux dire? –

+1

ce que je veux dire est le premier sera, je pense, un IEnumerable tandis que le second sera un long – Fredou

Répondre

12

Les deux instructions exécutent différentes fonctions.

La première pourrait renvoyer plusieurs enregistrements.

La seconde ne retournera qu'un seul CategoryID. Il lancera également une exception si au moins un enregistrement n'est pas trouvé.

La requête suivante serait l'équivalent à votre première déclaration:

var categoryID = DataContext.Categories.Where(c => c.Name == name).CategoryID; 

Et ce qui suit est la syntaxe de requête équivalente à la deuxième déclaration:

var categoryID = (from c in DataContext.Categories 
       where c.Name == name 
       select c.CategoryID).Single(); 

De toute façon, la cohérence est probablement la le plus important (les performances doivent être égales les unes aux autres puisqu'elles sont toutes les deux exécutées de la même manière). Si vous utilisez une syntaxe de requête, respectez-la. Si vous commencez à utiliser lambda expressions, utilisez-les autant que possible.

+0

+1, 17sec plus rapide que moi :-) – Fredou

+0

Aussi, s'il n'y a pas d'enregistrement avec l'ID donné, le second va jeter. –

+0

Merci pour l'équivalent pour le premier. Qu'est-ce qui est équivalent pour la première déclaration sans => expression? Merci –

3

Ce ne sont pas les mêmes.

Le premier retournera une liste s'il y a beaucoup de correspondances.

La seconde n'en retournera qu'une seule.

0

Comme déjà noté, les deux sont différents, mais je pense que le but de votre question est de savoir s'il y a une différence entre le style "SQL" et les expressions LINQ "Lambda".

Si oui, il y a une question similaire ici:

LINQ: Dot Notation vs Query Expression

+0

en termes de performance aussi bien? –

+0

La syntaxe de requête est vraiment juste convertie en syntaxe lambda par le compilateur, donc tant que les deux instructions sont vraiment écrites pour faire la même chose, elles sont équivalentes. –

Questions connexes