2010-05-26 4 views
2

J'ai couru à travers une intéressante Linq to SQL, euh, fonctionnalité, l'autre jour. Peut-être que quelqu'un peut me donner une explication logique du raisonnement derrière les résultats. Prenez le code ci-dessous comme mon exemple qui utilise la configuration de base de données AdventureWorks dans un DataContext Linq to SQL. Ceci est un extrait de mon test unitaire. Le client résultant renvoyé d'un appel à CustomerQuery_Test_01() et CustomerQuery_Test_02() est le même. Cependant, la requête exécutée sur SQLServer est différente est un moyen majeur. La méthode CustomerQuery_Test_01 provoque la matérialisation de la totalité de la table Customer, que l'appel à CustomerQuery_Test_02 ne provoque que la matérialisation du client unique. Les requêtes SQL résultantes sont en bas de ce post. Quelqu'un at-il une bonne raison à cela? Pour moi, c'était très non intuitif.requêtes LINQ to SQL matérialisation impaire

protected virtual Customer GetByPrimaryKey(Func<Customer, bool> keySelection) 
{ 
    AdventureWorksDataContext context = new AdventureWorksDataContext(); 
    return (from r in context.Customers select r).SingleOrDefault(keySelection); 
} 

[TestMethod] 
public void CustomerQuery_Test_01() 
{ 
    Customer customer = GetByPrimaryKey(c => c.CustomerID == 2); 
} 

[TestMethod] 
public void CustomerQuery_Test_02() 
{ 
    AdventureWorksDataContext context = new AdventureWorksDataContext(); 
    Customer customer = (from r in context.Customers select r).SingleOrDefault(c => c.CustomerID == 2); 
} 

requête pour CustomerQuery_Test_01 (notez l'absence d'une clause where)

SELECT [t0]. [CustomerID], [t0]. [NameStyle], [t0]. [Titre], [t0 ] [FirstName], [t0]. [MiddleName], [t0]. [LastName], [t0]. [Suffixe], [t0]. [CompanyName], [t0]. [SalesPerson], [t0]. [EmailAddress], [t0]. [Phone], [t0]. [PasswordHash], [t0]. [PasswordSalt], [t0]. [Rowguid], [t0]. [Date de modification] FROM [SalesLT]. [ Client] AS [t0]

Requête pour CustomerQuery_Test_02 (notez la clause where)

SELECT [t0]. [Code client], [t0]. [NomStyle], [t0]. [Titre], [t0]. [Prénom], [t0]. [Nom moyen], [t0]. [Nom] , [t0]. [Suffixe], [t0]. [NomSociété], [t0]. [SalesPerson], [t0]. [EmailAddress], [t0]. [Téléphone], [t0]. [Mot de Passe], [ t0]. [PasswordSalt], [t0]. [rowguid], [t0]. [ModifiedDate] DE [SalesLT]. [client] t0 AS [] OÙ [t0]. [CustomerID] = @ p0

Répondre

1
Func<Customer, bool> keySelection 

Ce n'est pas un Expression<Func<Customer, bool>> ... le compilateur résolu Enumerable.Single au lieu de Queryable.Single