2009-10-12 4 views
0

Veuillez regarder mon code source. J'essaie d'appeler la méthode Select environ 1000 fois et d'appeler la méthode Select2 environ 1000 foisPourquoi je ne trouve aucun avantage à mettre en cache la requête LINQ to Entity?

public class EntityQuery 
{ 
    public static Func<AdventureWork2008Container, IQueryable<SalesPerson>> selectQuery = CompiledQuery.Compile 
    (
     (AdventureWork2008Container aw) => 
     (
      from s in aw.SalesPerson 
      join e in aw.Employee on s.BusinessEntityID equals e.BusinessEntityID 
      join p in aw.Person on s.BusinessEntityID equals p.BusinessEntityID 
      join bea in aw.BusinessEntityAddress on s.BusinessEntityID equals bea.BusinessEntityID 
      join a in aw.Address on bea.AddressID equals a.AddressID 
      join sp in aw.StateProvince on a.StateProvince equals sp 
      select s 
     ) 
    ); 

    public decimal Select(AdventureWork2008Container aw) 
    { 
     SalesPerson result = selectQuery(aw).First(); 
     return result.SalesYTD; 
    } 

    public decimal Select2(AdventureWork2008Container aw) 
    {    
     SalesPerson result = 
     (
      from s in aw.SalesPerson 
      join e in aw.Employee on s.BusinessEntityID equals e.BusinessEntityID 
      join p in aw.Person on s.BusinessEntityID equals p.BusinessEntityID 
      join bea in aw.BusinessEntityAddress on s.BusinessEntityID equals bea.BusinessEntityID 
      join a in aw.Address on bea.AddressID equals a.AddressID 
      join sp in aw.StateProvince on a.StateProvince equals sp 
      select s 
     ).First(); 

     return result.SalesYTD; 
    } 
} 

Mais le résultat me montre que la méthode Select2 est un peu plus rapide que la méthode Select d'environ 0,005 s. (0,052/0,057 s.) De plus, cette capture n'inclut pas le temps de création de l'objet EntityQuery.

Quel est le problème avec mon code source?

PS. le code suivant montre comment appeler des méthodes.

private void button1_Click(object sender, EventArgs e) 
    { 
     using (AdventureWork2008Container aw = new AdventureWork2008Container()) 
     { 
      EntityQuery eq = new EntityQuery(); 

      eq.Select(aw); 
      long lastTime = DateTime.Now.Ticks; 

      for (int i = 0; i < 1000; i++) 
      { 
       eq.Select(aw); 
      } 
      listBox1.Items.Add("Select 1 : " + ShowTime(lastTime)); 
     } 

     GC.Collect(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     using (AdventureWork2008Container aw = new AdventureWork2008Container()) 
     { 
      EntityQuery eq = new EntityQuery(); 

      eq.Select2(aw); 
      long lastTime = DateTime.Now.Ticks; 

      for (int i = 0; i < 1000; i++) 
      { 
       eq.Select2(aw); 
      } 
      listBox1.Items.Add("Select 2 : " + ShowTime(lastTime)); 
     } 

     GC.Collect(); 
    } 

Répondre

0

Dans Select2() code généré est

SELECT TOP 1 * FROM ... 

à agréger Select() est effectué sur le dessus de la demande. Je ne sais pas avec certitude, mais cela pourrait entraîner la suppression des résultats de .Compile().

Essayez de déplacer .First() dans la requête compilée.

public static Func<AdventureWork2008Container, SalesPerson> selectQuery = CompiledQuery.Compile 
(
    (AdventureWork2008Container aw) => 
    (
     from s in aw.SalesPerson 
     join e in aw.Employee on s.BusinessEntityID equals e.BusinessEntityID 
     join p in aw.Person on s.BusinessEntityID equals p.BusinessEntityID 
     join bea in aw.BusinessEntityAddress on s.BusinessEntityID equals bea.BusinessEntityID 
     join a in aw.Address on bea.AddressID equals a.AddressID 
     join sp in aw.StateProvince on a.StateProvince equals sp 
     select s 
    ).First(); 
); 

Espérons que cela aidera.

+0

Merci. Je l'essaye. Ça marche! Dans le premier cas, la requête mise en cache est plus rapide que la requête non mise en cache environ 17 fois. En outre, dans tout sélectionner tous les cas; La requête mise en cache est plus rapide que la requête non mise en cache environ 3 fois (je pense que la plupart du temps est consacré à la récupération des données). –

Questions connexes