2010-08-07 14 views
0

J'ai la requête LINQ suivanteparalléliser requête LINQ avec Let, Sélectionnez Mots-clés

var meshesList= (
      from element in elementCoord.Elements 
       let coordinateList = elementCoord.Coordinates 
       select new Plane3D 
          { 
           Pt1 = coordinateList[element.NodeList[0]], Pt2 = coordinateList[element.NodeList[1]], Pt3 = coordinateList[element.NodeList[2]] 
          } 

        into meshPlan 
        let algo = new AlgoProvider() 
        where WellBehaveMesh(meshPlan) 
        select algo.ComputeVolume(meshPlan, platformPlan)).ToList(); 

Le from jusqu'à ce que into meshPlan sélectionnera une liste de meshPlan s. Et c'est une partie dont je pense que la parallélisation peut profiter.

Une idée sur la façon d'utiliser PLINQ pour paralléliser l'opération ci-dessus?

J'ai essayé l'opération suivante:

var meshesList= (
      (from element in elementCoord.Elements 
       let coordinateList = elementCoord.Coordinates 
       select new Plane3D 
          { 
           Pt1 = coordinateList[element.NodeList[0]], Pt2 = coordinateList[element.NodeList[1]], Pt3 = coordinateList[element.NodeList[2]] 
          } 

        into meshPlan).AsParallel() //cannot compile 
        let algo = new AlgoProvider() 
        where WellBehaveMesh(meshPlan) 
        select algo.ComputeVolume(meshPlan, platformPlan)).ToList(); 

mais malheureusement il ne peut pas compiler.

Répondre

2

La façon la plus simple d'obtenir ce au travail est de le casser en deux expressions de requête: travail

var meshPlans = from element in elementCoord.Elements 
       let coordinateList = elementCoord.Coordinates 
       select new Plane3D 
       { 
        Pt1 = coordinateList[element.NodeList[0]], 
        Pt2 = coordinateList[element.NodeList[1]], 
        Pt3 = coordinateList[element.NodeList[2]] 
       }; 

var meshesList = (from meshPlan in meshPlans.AsParallel() 
       let algo = new AlgoProvider() 
       where WellBehaveMesh(meshPlan) 
       select algo.ComputeVolume(meshPlan, platformPlan)).ToList(); 

Compte tenu des expressions de requête de façon (et let), je ne suis pas sûr que vous pouvez faire exactement ce que vous vouloir uniquement dans une seule expression de requête. D'autre part, avez-vous essayé de mettre AsParallel() sur la première propriété elementCoord.Elements? C'est la même boucle que vous auriez parallélisée de toute façon, effectivement ... juste un peu plus tôt.