C# 如何在运行时有条件地使用 AsParallel 或动态附加

问题描述

这是通过 LINQ 连接两个数据表的示例

 var JoinResult = (from p in dt.AsEnumerable()  
                   join t in dtTax.AsEnumerable()  
                   on p.Field<int>("Tax Id") equals t.Field<int>("Tax Id")  
                   select new  
                   {  
                       ProductName = p.Field<string>("Product Name"),BrandName = p.Field<string>("Brand Name"),ProductCategory = t.Field<string>("Product Category"),TaxCharge = t.Field<int>("Charge")   
                   }).ToList(); 

有时两个数据表中的数据量可能很大,而有时两个数据表中的数据量很小。当数据量很小时 AsParallel() 不需要,因为我知道 AsParallel() 在运行少量数据时会变慢,但是当数据量很大时 >AsParallel() 运行良好且速度快。

请告诉我如何动态地使用 AsParallel() 作为结果,当数据量很大时,同样的方式 AsParallel() 在数据量时不会被应用会很小。

How to build dynamic query with expression tree for PLINQ

我没有找到适合我的场景的好的解决方案来动态附加 AsParallel() 与我的 linq 查询。请分享知识以实现我的目标。谢谢

解决方法

老实说,我认为这是不可能的。 LINQ 和 PLINQ 具有不同的运算符。 LINQ 运算符在 IEnumerable<T> 上运行,而 PLINQ 运算符在 ParallelQuery<T> 上运行。因此,尽管查询的两个版本(带和不带 AsParallel)看起来完全相同,但它们本质上是两个完全不同的查询。

,

只需创建两个执行分支,其中一个使用 AsParallel()

if (hugeAmountOfData)
{
    result = (
                 ...
                 query.AsParallel()
                 ...
             ).ToList();
}
else
{
    result = (
                 ...
                 query
                 ...
             ).ToList();
}