2010-11-09 4 views
3

Un échantillon de requête LINQ de MSDN:requêtes LINQ efficace et appropriée de la base de données

var expensiveInStockProducts = 
    from p in products 
    where p.UnitsInStock > 0 && p.UnitPrice > 3.00M 
    select p; 

Est-ce que cette requête sélectionnez toutes les colonnes de la table de base de données immédiatement, ou faut-il revenir une sorte de pointeur qui retieves les données de colonne réelle à la demande? c'est à dire. S'il y a 50 colonnes dans ma table et que je n'utilise qu'un seul p.UnitsInStock dans mon code actuel, puis-je récupérer 50 fois plus de données que je ne le pensais?

+2

parlez-vous des colonnes ou des lignes? On dirait que vous parlez de lignes, mais je ne suis pas sûr. –

Répondre

3

si vous débogué que vous devriez voir chaque colonne de votre table products dans la partie SELECT ... de la requête

si vous avez select p.UnitsInStock vous ne verrez que dans la partie SELECT ... de la requête.

Pour répondre à votre question, oui, il ne sélectionne chaque colonne sauf si vous spécifiez ce que vous voulez ou vider la sélection dans un objet anonyme comme ceci:

var expensiveInStockProducts = 
    from p in products 
    where p.UnitsInStock > 0 && p.UnitPrice > 3.00M 
    select new { p.UnitsInStock, p.SomeOtherColumn } 
+0

Ok, une réponse si courte est que faire un "p" à grande échelle est un mauvais choix si la plupart des données de cette colonne ne sont pas nécessaires? – linq

+0

oui, si vous ne voulez qu'une seule colonne, alors sélectionnez p.ColumnName. Si vous avez besoin de plusieurs colonnes, créez un nouvel objet à la volée et obtenez les colonnes que vous voulez. – Miles

1

Je conseillerais à l'aide LINQPad si vous voulez voir le SQL généré, il aide vraiment à visualiser, juste pour aider avec ce que vous voulez, vous pouvez (si vous avez besoin des données localement), utilisez un objet anonyme ou sélectionnez dans une classe concrète au sein de votre modèle d'application,

si

Anony protocoles d'entente

var expensiveInStockProducts = 
from p in products 
where p.UnitsInStock > 0 && p.UnitPrice > 3.00M 
select new { 
      p.ColumnIWant1, 
      p.ColumnIWant2 
      }; 

ou pour une classe concrète

var expensiveInStockProducts = 
from p in products 
where p.UnitsInStock > 0 && p.UnitPrice > 3.00M 
select new MyClass() { 
      ColumnIWantAsField1 = p.ColumnIWant1, 
      ColumnIWantAsField2 = p.ColumnIWant2 
      }; 
+0

Cela m'a été utile. –

Questions connexes