不久前,我和自己相似。我想到的是在LINQ中使用AsParallel()函数。。。然而,这有几个警告 您将并行运行一些事情-很明显,但是如果您试图以非线程安全的方式进行操作,则可能会出现问题 这只在某些情况下有用——我最大限度地利用它是在我将大量数据库行转换为C#对象并重复执行时。。。比如,想想foreach,while循环中没有任何决策逻辑,只是一个直接的数据库行到C#class的转换 它只对“大”数据量才有意义——您需要仔细研究一下,看看时间上的差异是什么,但是如果您只是转换少数行,AsParallel()的开销实际上会花费您更多的时间,而不是节省您的时间

不久前,我和自己相似。我想到的是在LINQ中使用AsParallel()函数。。。然而,这有几个警告 您将并行运行一些事情-很明显,但是如果您试图以非线程安全的方式进行操作,则可能会出现问题 这只在某些情况下有用——我最大限度地利用它是在我将大量数据库行转换为C#对象并重复执行时。。。比如,想想foreach,while循环中没有任何决策逻辑,只是一个直接的数据库行到C#class的转换 它只对“大”数据量才有意义——您需要仔细研究一下,看看时间上的差异是什么,但是如果您只是转换少数行,AsParallel()的开销实际上会花费您更多的时间,而不是节省您的时间,c#,linq,entity-framework,linq-to-entities,C#,Linq,Entity Framework,Linq To Entities,下面是关于AsParallel()的更多阅读资料,希望对您有所帮助 -门冬氨酰法 -并行查询简介 -AsParallel的良好基本演练您能分享该查询吗?执行计划?数据集大小?上面发布的查询。执行计划可能与查询本身的速度无关。这是它被转换成对象的部分,我看到很多连接和firstordefaults。您的模型上没有导航属性吗?这个查询包含10个不同的子查询——这肯定需要很长时间。执行该查询时,实际包含多少个对象?它们必须被解析成对象并通过网络发送,这可能需要很长时间,但这确实很长。当你提到导航属性时

下面是关于AsParallel()的更多阅读资料,希望对您有所帮助

-门冬氨酰法

-并行查询简介


-AsParallel的良好基本演练

您能分享该查询吗?执行计划?数据集大小?上面发布的查询。执行计划可能与查询本身的速度无关。这是它被转换成对象的部分,我看到很多连接和firstordefaults。您的模型上没有导航属性吗?这个查询包含10个不同的子查询——这肯定需要很长时间。执行该查询时,实际包含多少个对象?它们必须被解析成对象并通过网络发送,这可能需要很长时间,但这确实很长。当你提到导航属性时,你是在说延迟加载吗?如果是这样的话,这将是不好的,因为查询返回大约14000个对象。这将是对数据库的大量往返。导航属性只有在您将它们标记为虚拟时才使用延迟加载,否则它们将急切地加载。你是说你的列表返回14000个对象?因此,14000个对象x每个对象10个查询意味着14000个查询,然后将每个结果转换为一个对象,并通过网络传输。你考虑过分批检索吗?例如:每个请求50个用户ID?我认为你正在做一个如此昂贵的操作,以至于优化可能必须用另一种方法进行搜索。并行性不是一个未优化算法的解决方案——它只是隐藏了一个问题,这个问题以后肯定会再次出现。除非已经确定算法是最好的,否则您应该专注于修复它,而不是症状。是的,但问题的结尾是:“在执行这部分操作时,是否有任何有用的技巧可以帮助LINQ/Entity Framework?”。正如我的回答所述,使用并行查询有一些注意事项,我刚刚在最近完成的一个项目中遇到了完全相同的问题,所以这个答案基于我自己的经验/融合,在尽我所能精简SQL查询之后,这个问题也说明了已经发生了。嗨,笔名-非常感谢你的回答。为了清楚起见,当我对包含LINQ的IQueryable对象调用ToList()方法时,会发生延迟。在此之前,我尝试添加AsParallel(),但没有任何区别。现在想一想,我也不确定这是否行得通。
var q1 = from u in etc.Users
         where (u.flags & (int)UserFlags.Student) == (int)UserFlags.Student
         && (ariStudents.Contains(u.id) || ariStudents.Count == 0)
         && (from ua in etc.UserAssociations where ua.datasetId == datasetId && ua.userId == u.id && ua.type == (int)UserAssocTypes.EnrolActive select ua).Any()
         orderby u.id
         select new ElightsRaw2
         {
             Student = new ElrStudent{StudentId = u.id},
             StudentData = (
                    from sd in etc.StudentDatas
                    where sd.userId == u.id
                    && sd.datasetId == datasetId
                    select new ElrStudentData { attP = sd.attP, attA = sd.attA, attL = sd.attL }
                ).FirstOrDefault(),
             ElightOverall = (
                    from els in etc.eLightsStudents
                    where els.datasetId == datasetId
                    && els.userId == u.id
                    select els
                ).FirstOrDefault(),
             Groups = (
                 // get all courses and groups for user
                    from c in etc.Cours
                    join g in etc.Groups on c.id equals g.courseId
                    join ua in etc.UserAssociations on g.id equals ua.fkId
                    where ua.datasetId == datasetId
                    && ua.userId == u.id
                    && ua.type == (int)UserAssocTypes.EnrolActive
                    && (ua.flags & (int)UserAssociationFlags.AssociationDeleted) == 0
                    && (c.flags & (int)CourseFlags.Deleted) == 0
                    select new ElrGroupHolder
                    {
                        CourseName = c.name,
                        GroupName = g.name,
                        Breakdown = new ElrGroupHolderBreakdown
                        {
                            UnitsBelowScoreThresh1 = (
                                    from uus in etc.UserUnitScores
                                    join un in etc.Units on uus.unitId equals un.id
                                    join cu in etc.CourseUnits on un.id equals cu.unitId
                                    where uus.userId == u.id
                                    && (un.flags & (int)UnitFlags.Deleted) == 0
                                    && (cu.flags & (int)CourseUnitFlags.NotStarted) == 0
                                    && cu.courseId == c.id
                                    && (uus.performance > -1 && uus.performance <= amberThresh)
                                    && !(from exc in etc.UserAssociations where exc.userId == u.id && exc.fkId == un.id && exc.type == (int)UserAssocTypes.ExcludedUnit select exc).Any()    // not excluded from unit
                                    select uus
                                ).Count(),
                            UnitsBelowScoreThresh2 = (
                                    from uus in etc.UserUnitScores
                                    join un in etc.Units on uus.unitId equals un.id
                                    join cu in etc.CourseUnits on un.id equals cu.unitId
                                    where uus.userId == u.id
                                    && (un.flags & (int)UnitFlags.Deleted) == 0
                                    && (cu.flags & (int)CourseUnitFlags.NotStarted) == 0
                                    && cu.courseId == c.id
                                    && (uus.performance > -1 && uus.performance <= redThresh)
                                    && !(from exc in etc.UserAssociations where exc.userId == u.id && exc.fkId == un.id && exc.type == (int)UserAssocTypes.ExcludedUnit select exc).Any()    // not excluded from unit
                                    select uus
                                ).Count(),
                            CfcCount = (
                                    from cfc in etc.CFCs
                                    where cfc.datasetId == datasetId
                                    && cfc.studentId == u.id
                                    && cfc.dt > dCfcCutoff
                                    && cfc.type == (int)CfcTypes.Concern
                                    && (cfc.flags & (int)CfcFlags.Deleted) == 0
                                    && (
                                        // only include attendance and behaviour CFCs
                                        (cfc.flags & (int)CfcFlags.Attendance) == (int)CfcFlags.Attendance
                                        || (cfc.flags & (int)CfcFlags.Behaviour) == (int)CfcFlags.Behaviour
                                    )
                                    select cfc
                                ).Count(),
                            SrsScores = (
                                    from srs in etc.SRScores
                                    join sr in etc.SubReviews on srs.srId equals sr.id
                                    where sr.datasetId == datasetId
                                    && (sr.flags & (int)SrFlags.Deleted) == 0
                                    && (srs.flags & (int)SrsFlags.Deleted) == 0
                                    && sr.dt > dCfcCutoff
                                    && sr.userId == u.id
                                    && sr.courseId == c.id
                                    select new ElrSrScore
                                    {
                                        attainment = srs.attainment,
                                        attitude = srs.attitude,
                                        motivation = srs.motivation,
                                        studyskill = srs.studyskill
                                    }
                                ).ToList(),
                            ElightEnrolment = (
                                    from ele in etc.eLightsEnrolments
                                    where ele.datasetId == datasetId
                                    && ele.groupId == g.id
                                    && ele.userId == u.id
                                    select ele
                                ).FirstOrDefault(),
                        },
                        CourseAttendance = (
                                from a in etc.Attendances
                                where a.studentId == u.id
                                && a.courseId == c.id
                                && a.weekNumberId == null
                                && a.datasetId == datasetId
                                select a
                            ).FirstOrDefault()
                    }
                ).ToList(),
         };

return q1.ToList();