Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对DataTable上的GroupBy使用动态LINQ_C#_.net_Linq_C# 3.0 - Fatal编程技术网

C# 对DataTable上的GroupBy使用动态LINQ

C# 对DataTable上的GroupBy使用动态LINQ,c#,.net,linq,c#-3.0,C#,.net,Linq,C# 3.0,我已经看到了很多让动态LINQ为.GroupBy工作的方法,但是我看到的每一种方法似乎都希望使用硬编码实体。我想将以下内容复制为动态LINQ: //need dynamic LINQ for this var groupedRows = rows.GroupBy(z => new { make = z["make"], model = z["model"] }) .Select(x => x.Key); 我希望能够做到这一点,使整个函数成

我已经看到了很多让动态LINQ为.GroupBy工作的方法,但是我看到的每一种方法似乎都希望使用硬编码实体。我想将以下内容复制为动态LINQ:

//need dynamic LINQ for this
var groupedRows = rows.GroupBy(z => new { make = z["make"], model = z["model"] })
                      .Select(x => x.Key);
我希望能够做到这一点,使整个函数成为字符串:

var groupedRows = rows.GroupBy(z => "new { make = z[\"make\"], model = z[\"model\"] }")
我意识到,如果它只是一个常规实体,我可以做到这一点

mylist.GroupBy(z => new { make = z.make, model = z.model }).Select(x => x.Key);
如果我有一个固定的实体,我可以使用


我试图让它与非强类型的常规数据表一起工作。有什么想法吗

我认为这是不可能的;这表明您希望C编译器在运行时编译字符串= 问题不在于make和model索引器,而在于您返回的新实例中的成员;这些只能通过反射进行文本表示,但我知道LINQtoEntities不支持其功能,不确定普通LINQ是否会支持。 你能接受反射解决方案吗?
在我花两个小时试着让它工作之前,我想知道你是否对它满意。

好的,我能够在运行时使用Mono编译器作为服务来实现反射和编译代码。利用这个问题,我在回答这个问题时提出了以下解决方案2:

DataTable dt = GetData();
         var dataRows = dt.AsEnumerable();

         //Initializing the evaluator  
         Evaluator.Init(new string[0]); 
          Evaluator.ReferenceAssembly(Assembly.GetAssembly(typeof(DataRow)));
          Evaluator.ReferenceAssembly(Assembly.GetExecutingAssembly());

         Evaluator.Run(@"using System;  
           using System.Linq;  
           using System.Collections.Generic;
           using System.Data;
           using MyNamespace;");

         var func = (Func<DataRow, object>)Evaluator.Evaluate(@"new Func<DataRow,object>(z => new
                {
                    make = z[""make""],
                    model = z[""model""]
                });");

         dataRows.GroupBy(func).Select(x => x.Key);
这样在运行时编译函数,然后在GroupBy中为每一行调用函数。当我需要make或model的值时,我需要通过GetPropertyValue扩展方法使用反射来获得该值


我仍然无法让LINQ在MCS中工作,即使在回答了这个问题之后,但仅仅使用它来创建函数就完成了我需要它做的事情。

我完全可以使用反射解决方案。这里的问题显然是性能,这取决于需要多少。如果每一行的每一列都需要它,我会怀疑这会是个问题。只要一次,没问题。我相信我们最多会达到500行左右。你能给我一个“行”的示例吗?它只是一堆相似的对象吗?它是一个数据表。好吧,我放弃。。。。。这是不可能的,因为即使我们进行了分组,也不清楚如何访问它。我相信有一个更简单的方法来解决这一切。对不起=/