2010-04-28 3 views
2

Est-il possible de faire un travail en parallèle avec framework d'entité pour l'exemple suivant?Parallel EntityFramework

using (var dbContext = new DB()) 
{ 
var res = (from c in dbContext.Customers 
      orderby c.Name 
      select new 
        { 
        c.Id, 
        c.Name, 
        c.Role 
        } 
     ).ToDictionary(c => c.Id, 
         c => new Dictionary<string, object> { 
                   { "Name",c.Name }, 
                   { "Role", c.Role } 
                  }); 
} 

Pour l'exampe, qu'est-ce qui va changer si j'ajoute AsParrallel?

using (var dbContext = new DB()) 
{ 
var res = (from c in dbContext.Customers 
      orderby c.Name 
      select new 
        { 
        c.Id, 
        c.Name, 
        c.Role 
        } 
     ).AsParallel().ToDictionary(c => c.Id, 
         c => new Dictionary<string, object> { 
                   { "Name",c.Name }, 
                   { "Role", c.Role } 
                  }); 
} 

Et encore un exemple. La question est la même, quelles sont les différences dans 3 exemples.

using (var dbContext = new DB()) 
{ 
var res = (from c in dbContext.Customers.AsParallel() 
      orderby c.Name 
      select new 
        { 
        c.Id, 
        c.Name, 
        c.Role 
        } 
     ).AsParallel().ToDictionary(c => c.Id, 
         c => new Dictionary<string, object> { 
                   { "Name",c.Name }, 
                   { "Role", c.Role } 
                  }); 
} 
+0

Pourquoi voudriez-vous? Cette requête bénéficiera de la parallélisation, même si cela a fonctionné. Il serait probablement plus lent * * –

Répondre

8

Non, la requête est exécutée sur la base de données, pas dans le client. La base de données peut faire la requête en utilisant plusieurs threads pour accélérer le processus, mais dans tous les cas, vous ne pouvez pas combiner le traitement côté serveur avec les extensions parallèles côté client.

+0

Et dans un tel cas, quelle est la différence entre deux exemples? – mehanik

+0

Je ne suis pas sûr. Soit 'AsParallel()' lancera une exception ou ne modifiera pas l'énumérable. –

+0

Non cela fonctionne sans exceptions. – mehanik

1

Vous pouvez avec PLINQ (Parallel LINQ)

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

http://msdn.microsoft.com/en-us/magazine/cc163329.aspx

Par exemple (ci-dessus):

données IEnumerable = ...; var q = data.AsParallel(). Où (x => p (x)). Orderby (x => k (x)) .Sélectionner (x => f (x));

foreach (var e dans q) a (e);

Pour le foreach, vous pouvez également utiliser la version TPL (Task Parallel Library). http://msdn.microsoft.com/en-us/library/dd460717(v=VS.100).aspx

+0

Est-il possible d'utiliser PLINQ pour EntityFramework? Ce n'est pas une application réelle. Je veux comprendre les différences d'exemples en théorie? Comment ça va marcher? Est-ce que certains threads seront créés ou non? – mehanik

+0

@mehanik Je ne pense pas qu'il soit possible de le faire fonctionner sur Sql Server. Je pense que PLinq est juste une extension pour les types énumérables en mémoire. Le traitement côté serveur ne peut pas être géré à partir du client. c'est mon opinion – ArgeKumandan