2009-08-11 7 views
3

J'ai lu à propos de cet opérateur sur un livre mais étant donné que je n'utilise pas beaucoup de bases de données, je ne peux pas penser à une situation où je voudrais obtenir un seul article. Je veux dire, je peux avoir un ensemble de conditions, mais ensuite j'utiliserais First ou Last, pas Single. Quelle est la différence? À quoi cela sert-il de renvoyer un seul élément et de lancer une exception s'il n'y a pas de résultat ou plus d'un? La seule chose qui me vient à l'esprit serait de m'assurer qu'il n'y a vraiment qu'un seul article.LINQ - Opérateur unique

Merci!

Répondre

6

C'est exactement pourquoi vous voudriez cela. Parfois, avoir plus d'un élément dans le jeu de résultats indique un bug quelque part et vous souhaitez qu'une exception soit levée si ce n'est pas le cas.

+0

Ah, c'est le seul cas où vous voudriez que? –

6

L'exemple classique est ici quand vous avez une carte d'identité (et attendez-vous donc les données existent, unique, par cet identifiant):

var item = ctx.SomeTable.Single(x=>x.Id == id); 

Vous pouvez vérifier SingleOrDefault si utile (pour donner un meilleur message d'erreur si vous obtenez un null), mais obtenir 2 (ou plus) est certainement un gros problème.

+0

+1 bon exemple. –

1

Les extensions LINQ sont également utiles en dehors des bases de données. Un exemple réel était de trouver la bonne usine à partir d'une structure pour une chaîne d'entrée donnée. Si la chaîne d'entrée correspond à plusieurs usines, cela a été considéré comme une erreur (ou au moins une gestion de cas spéciale nécessaire). J'ai également utilisé LINQ (et single en particulier) pour construire des tests unitaires.

Exemple:

try { 
     IWorkspaceFactory factories[] = { 
     new SdeFactory(), new FGDBFactory(), new AccessFactory() }; 
     IWorkspace workspace = factories 
     .Single(wf=>wf.IsWorkspace(input)).Open(input); 
     workspace.DoSoething(); 
    } catch(OperationException) { 
     //can't remember the exact exception off the top of my head 
     //Catch more than one match 
    }