在DataTable上使用动态LINQ for GroupBy
我已经看到了很多方法让动态LINQ为.GroupBy
工作,但我看到的每一个似乎都期望一个硬编码实体。我想重现以下动态LINQ:在DataTable上使用动态LINQ for GroupBy
//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);
如果我有正规的实体,我可以用Mitsu's dynamic GroupByMany。
我想让这与常规数据表(不强类型)工作。有任何想法吗?
好吧,我能够得到这个反应和编译代码在运行时使用单声道编译器作为服务(MCS)。利用问题Injecting a variable into the Mono.CSharp.Evaluator (runtime compiling a LINQ query from string),我想出了以下解决方案(#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扩展方法使用反射来获取该值。
即使在遵循Mono Compiler as a Service (MCS)的问题之后,我仍然无法在MCS中获得LINQ工作,但是只是使用它来创建函数,我做了我需要的工作。
我不认为这是可能的;这表明您希望C#编译器在运行时编译您的字符串=)
问题不在于“make”和“model”索引器,它是您返回的新实例中的成员;那些只能用Reflection来表示文本,但我知道LINQ-to-Entities不支持它的功能,不知道是否正常的LINQ会。
你可以用反射解决方案吗?
我想知道,如果你没事,我花了两个小时试图让它工作=)
我绝对可以用反射解决方案。这显然是表现的问题,这取决于需要多少。如果每一行的每一列都需要它,我会怀疑这会是一个问题。如果只是一次,没问题。我相信我们会达到500行左右的最大值。 – DougJones 2010-11-09 00:23:05
你可以给我一个'行'的示例实例吗?它只是一堆类似的物体吗? – BeemerGuy 2010-11-09 00:31:48
这是一个数据表。 – DougJones 2010-11-09 00:46:07