Распараллелить LINQ Query с помощью Let, Select Keywords - PullRequest
0 голосов
/ 07 августа 2010

У меня есть следующий запрос LINQ

  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();

. От from до into meshPlan будет выбран список meshPlan с.И это та часть, которой, я считаю, может помочь параллелизация.

Есть идеи, как использовать PLINQ для распараллеливания вышеуказанной операции?

Я пробовал следующую операцию:

  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();

но, к сожалению, она не может скомпилироваться.

1 Ответ

2 голосов
/ 07 августа 2010

Самый простой способ заставить это работать - разбить его на два выражения запроса:

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();

Учитывая то, как работают выражения запроса (и let), я не уверен, что вы можете сделатьименно то, что вы хотите только в одном выражении запроса.

С другой стороны, вы пытались просто поместить AsParallel() в первое elementCoord.Elements свойство?Это тот же цикл, который вы бы в любом случае распараллеливали, фактически ... чуть раньше.

...