2009-11-05 7 views
1

Quelle est la différence entre les deuxCe qui est différent LINQ to SQL clause where

1)

context.connection.open() 

var albums = (from a in context.Albums 
       where a.id == id 
      select a); 

context.connection.close() 

2)

context.connection.open() 

var albums = (from a in context.Albums 
      select a); 

context.connection.close() 

var result = albums.where((a)=>{a.id == id}); 

Serait-il plus rapide en utilisant la première

Répondre

2

La clause where dans la seconde semble être une syntaxe incorrecte, en dehors de l'ouverture/fermeture de la connexion, ils devraient évaluer à le même code. C'est-à-dire que le SQL sera généré et exécuté lorsque l'ensemble de résultats est réellement énuméré.

Vous pouvez omettre le reste du code et il suffit d'écrire:

var albums = from a in context.Albums 
      where a.id == id 
      select a; 

ou

var albums = context.Albums.Where(a => a.id == id); 

Ils évalueront la même chose lorsque les résultats sont dénombrés.

+0

Merci pour toute votre réponse .. Hmm .. Je suis un peu confus avec la couche logique de données. Cela signifie-t-il que le contexte de données que nous avons généré dans vsnet représente déjà la couche de logique de données ... – LittleFunny

1

Il y a une très légère différence due à ce qu'on appelle requêtes dégénérées. Mis à part le calendrier de connexion, la première appelle efficacement:

var albums = contact.Albums 
        .Where(a => a.id == id); 

alors que le second aura un appel Select supplémentaire dans ce:

var albums = contact.Albums 
        .Select(x => x) 
        .Where(a => a.id == id); 

Cela dit, je serais certainement attendre LINQ to SQL pour émettre le même SQL dans les deux cas.

1

Quintin a raison. Il n'y aurait qu'un (énorme) différence si vous évaluer immédiatement la requête:

var albums = (from a in context.Albums 
       where a.id == id 
       select a) 
      .ToList(); // force query evaluation 
         // 'SELECT * from Albums where id = ...' 

contre

var albums = (from a in context.Albums 
       select a) 
       .ToList(); // force query evaluation 
         // 'SELECT * from Albums' 

var result = context.Albums.Where(a => a.id == id); // filters the list in memory 
1

Pour comprendre pourquoi il n'y a pas de différence, examiner comment le LINQ aux travaux de fournisseur SQL. Lorsque vous utilisez des tables hors DataContext, vous utilisez le IQueryProvider. Chaque fois que vous utilisez une clause comme Où, Select, OrderBy, etc., vous n'exécutez rien - chacune de ces expressions est simplement donnée à IQueryProvider, et IQueryProvider fait une longue liste de clauses. Lorsque vous exécutez la requête en itérant les résultats, ces expressions sont rassemblées, combinées et converties en une requête T-SQL. Donc, cela n'a pas vraiment d'importance lorsque vous ajoutez les expressions ou dans quel ordre vous les ajoutez, tant que cela se produit avant que vous ne les fassiez disparaître.

Questions connexes