Je préfère utiliser des méthodes d'extension pour les opérations de base de Linq: Aujourd'hui, je me suis retrouvé avec ce qui suit requête: p> est-il dangereux (pour la lisibilité, la maintenabilité ou toute autre raison) de mélanger la syntaxe de requête et de l'extension? P> Cela a le potentiel d'être Très subjectif, si c'est-à-dire, je suis désolé si cela ne répond pas aux exigences relatives à une bonne question subjective. Faites-moi savoir si je peux l'améliorer! P> p> où () code>,
Sélectionnez code>, mais pour complexez
SELECT () CODE>, < Code> SELECTMANY () CODE>, et surtout
OrderBy (). () Code> Déclarations Je trouve la syntaxe de requête pour être beaucoup plus lisible et naturelle.
6 Réponses :
Vous pouvez faire quelque chose comme ça pour rendre les choses un peu plus faciles. Maintenant, vos requêtes ne sont pas mélangées p> p>
Je pense que @ Reed-Copsey. Donc, ce code ne fonctionne pas.
J'utilise les méthodes d'extension, mon collègue utilise la syntaxe de la requête. Il n'y a pas de différence. p>
Je dirais cependant que vous devriez briser une grande requête en plus petits pour le débogage et la lisibilité car il n'y a généralement pas de coûts de temps. P>
l'avoir fait moi-même (bien que pas pour. Où, mais pour .Cast) Je dirais que cela dépend beaucoup de quelles méthodes d'extension vous appelez. P>
E.g. Je me suis senti parfaitement habilité à utiliser .Cast car il n'était pas disponible dans le sucre syntaxique (Afaik) mais éviterait probablement. Où a probablement une représentation dans la syntaxe de la requête. P>
Cela dit que, j'utiliserais probablement. Sélectionnez pour muter les données dans une requête aussi ... mais je suis un peu triste. P>
Est-ce dangereux (pour la lisibilité, la maintenabilité ou toute autre raison) de mélanger la requête et la syntaxe d'extension? P> blockQuote>
Le plus grand danger que je considérerais est l'ajout potentiel de "surprise" dans votre code, en particulier lors de la visualisation par d'autres développeurs. P>
à partir d'un point de vue de la compilation, la syntaxe de requête est traduite directement dans les appels de la méthode d'extension. Il n'y a donc pas nécessairement un problème technique ici. Cependant, cela va potentiellement ajouter des appels de méthode supplémentaires qui ne seraient pas attendus par de nombreux développeurs. Ce pourrait em> conduire à un problème de maintenabilité potentiel. P>
Cela étant dit, s'il est fait avec parcimonie et avec une bonne raison, je ne pense pas qu'il y ait un vrai problème avec le mélange de la syntaxe. Ceci est en fait assez courant - par exemple, si vous souhaitez écrire dans la syntaxe de la requête, mais il est nécessaire d'évaluer complètement, il est souvent enveloppé entre parenthèses avec .tolist () ajouté - ou si vous souhaitez utiliser plinq avec la syntaxe de requête, il est souvent < Code> de x in Collection.Asparallel () code>, qui mélange techniquement la syntaxe ... p>
Merci, cela a le plus directement répondu à la plupart de mes pensées et préoccupations.
C'est une sorte d'appel de jugement, mais de nombreuses questions «meilleures pratiques» -Type ont tendance à être, au moins au début. Mon opinion est que vous devez utiliser l'un ou l'autre dans une seule déclaration. Pas vraiment pour aucun "danger" inhérent au mélange, mais pour la clarté.
Dans ce cas particulier, la clause où est très simple, et je le refroidirais dans la syntaxe de requête. P>
Il y a cependant des cas qui ne peut pas être élégamment exprimé en syntaxe de requête. Dans les cas où il est simplement inévitable de mélanger des syntaxes, les requêtes (à nouveau IMO) seront (à nouveau) être plus lisibles si vous divisez la chaîne de méthode dans sa propre variable, puis a simplement référencé cette variable dans la relevé de la syntaxie de la requête. Utiliser le vôtre comme modèle: p>
Je ne pense pas qu'il soit dangereux de mélanger, il pense que cela dépend de ce qui est plus lisible, la syntaxe de requête est très lisible, mais pas aussi flexible, alors mélanger un peu de chaînage semble être un petit prix à payer. Je suppose que la réponse est de savoir si vous pensez que le texte suivant entièrement enchaîné est plus lisible que ce que vous avez écrit, je pense personnellement que le vôtre est plus facile à lire.
_myObject.ObjectsParent .ParentsEnumerable .Where(c => c == anotherObject || c.Parent == anotherObject) .SelectMany(c => c.MyObjectsEnumerable, (c, q) => new {c, q}) .OrderBy(t => t.c.SortKey) .ThenBy(t => t.q.Description) .Select(t => new {Item = t.q, Text = t.c.Description + " -> " + t.q.Description});