2010-06-30 3 views
2

Mon entreprise vient de commencer LINQ et je vais avoir encore un peu de mal avec l'abstraction (si c'est un mot) de la commande LINQ et le SQL, ma question estLINQ mang .. meilleure méthode

Dim query = (From o In data.Addresses _ 
        Select o.Name).Count 

dans ce qui précède dans mon esprit, le SQL est de retour toutes les lignes et lapines un compte sur les lignes de nombre dans le résultat IQueryable, donc je serais mieux avec

Dim lstring = Aggregate o In data.Addresses _ 
    Into Count() 

Ou suis-je sur la pensée la façon dont fonctionne LINQ ? Utilisation de VB Express à la maison, donc je ne peux pas voir le SQL réel qui est envoyé à la base de données (je pense) que je n'ai pas accès au profileur SQL

+5

Complètement sans être un shill (affiliation zéro), je vous suggère de jeter un oeil à LINQPad - http://www.linqpad.net/ qui vous permet de voir le SQL généré à partir d'une expression LINQ to SQL, à la fois VB et C#, ce qui facilite le travail sur les extraits de requête sans reconstruction/réexécution. –

+0

@Marc Merci, cela m'a permis de répondre à la question moi-même .... bel outil .... ps, en faire une réponse, donc je peux le cocher s'il vous plaît :-) – spacemonkeys

Répondre

4

Comme mentionné, ceux-ci sont fonctionnellement équivalents, on utilise juste la syntaxe de requête.

Comme mentionné dans mon commentaire, si vous évaluez ce qui suit comme une déclaration de VB (s) dans LINQPad:

Dim lstring = Aggregate o In Test _ 
    Into Count() 

Vous obtenez ceci dans la fenêtre générée de sortie SQL:

SELECT COUNT(*) AS [value] 
FROM [Test] AS [t0] 

qui est la même que l'expression VB LINQ suivante évaluée:

(From o In Test_ 
    Select o.Symbol).Count 

Vous obtenez t il a exactement le même résultat.

2

Je ne suis pas familier avec Visual Basic, mais basé sur

http://msdn.microsoft.com/en-us/library/bb546138.aspx

Ces deux approches sont les mêmes. L'un utilise la syntaxe de la méthode et l'autre utilise la syntaxe de la requête.

Vous pouvez en être sûr à l'aide de SQL Profiler lorsque les requêtes sont exécutées. PS - Le «point» de LINQ est que vous pouvez facilement effectuer des opérations de requête sans laisser de code/VB-land.

+0

Cheers mais de ce que je ne peux pas le voir parle de .Count, en utilisant express pour le moment, donc ne pas avoir accès au profileur (doit dépenser de l'argent) .. PS j'ai eu votre PS, aurait dû dire "Ou je ne comprends pas la façon dont fonctionne LINQ" – spacemonkeys

0

Je pense qu'il vous manque le point car Linq avec SQL a une liaison tardive, la recherche est faite quand vous en avez besoin, donc quand vous dites que j'ai besoin du nombre, une requête est créée.

Avant que LINQ pour SQL crée des arbres d'expression qui seront "traduits" à SQL lorsque vous en avez besoin ....

http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

Comment déboguer voir Scott http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx alt text http://www.scottgu.com/blogposts/linqtosql3/step5.jpg

+0

la question ci-dessus? – spacemonkeys

+0

Désolé, la raison pour laquelle je pose la question est que lorsque je mets le dubugger ou .string sur "Dim requête = (De o Dans data.Addresses Sélectionnez o.Name) .Count" Je reçois 2 qui est le résultat, quand je faire la même chose pour l'autre requête que je reçois le "select count (*)" sql attendu, donc je penche pour ce dernier étant mieux .... mais comme je ne peux pas accéder au profiler, je ne peux pas déterminer – spacemonkeys

+0

Essayez utiliser l'enregistrement sur l'objet contexte .... http://www.codeproject.com/KB/linq/LINQ2Log4Net.aspx – salgo60

1

Une chose importante ici est que le code que vous donnez fonctionnera avec une grande variété de sources de données. Nous espérons que cela le fera de manière très efficace, même si cela ne peut pas être entièrement garanti. Cela sera certainement fait d'une manière efficace avec une source SQL (en cours de conversion en une requête SQL SELECT COUNT(*)) Cela sera fait efficacement si la source était une collection en mémoire (elle est convertie en appelant la propriété Count). t fait très efficacement si la source est un énumérable qui n'est pas une collection (dans ce cas, il lit tout et compte comme il va), mais dans ce cas, il n'y a vraiment pas une façon plus efficace de le faire.

Dans chaque cas, il a fait la même opération conceptuelle, de la manière la plus efficace possible, sans que vous ayez à vous soucier des détails. Pas de gros problème avec le décompte, mais un gros problème dans les cas plus complexes.

Dans une certaine mesure, vous avez raison lorsque vous dites "dans mon esprit, le SQL retourne toutes les lignes et le fait un compte sur les lignes de nombre". Conceptuellement est ce qui se passe dans cette requête, mais l'implémentation peut différer. Comparez avec la façon dont la requête réelle dans SQL peut ne pas correspondre à l'interprétation littérale de la commande SQL, pour permettre l'approche la plus efficace à choisir.

+0

Merci Jon, je pense que la seule chose que j'ai appris au cours du dernier mois d'utilisation de LinQ n'est pas de supposer ce que le SQL est produit (et de rester loin de tous les types d'objets iQueryable aussi longtemps que possible) – spacemonkeys

+0

Yep. En effet, parfois quand je regarde le SQL produit et cela me semble un peu étrange, alors aller au niveau suivant et regarder le plan de requête montre qu'en fait, le SQL produit par LINQ est meilleur que l'approche la plus évidente. Il est intéressant de regarder le SQL produit, esp. pour des requêtes plus complexes ou plus fréquentes, car vous pouvez l'aider avec des index et des statistiques appropriés. –

Questions connexes