代码之家  ›  专栏  ›  技术社区  ›  DougJones

在DataTable上为GroupBy使用动态LINQ

  •  0
  • DougJones  · 技术社区  · 15 年前

    我已经看到了很多让动态LINQ为 .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 .

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

    2 回复  |  直到 15 年前
        1
  •  0
  •   BeemerGuy    15 年前

    我不认为这是可能的;这表明您希望C#编译器在运行时编译您的字符串=)
    问题不在于“make”和“model”索引器,而在于您返回的新实例中的成员;这些只能通过反射以文本形式表示,但我知道LINQ to Entities不支持其函数,不确定普通LINQ是否支持。
    你能用反射法解决问题吗?
    我想知道在我花两个小时试着让它工作之前你是否同意

        2
  •  0
  •   Community Mohan Dere    9 年前

    好的,我可以在运行时使用Mono编译器作为服务(MCS)来处理反射和编译代码。利用问题 Injecting a variable into the Mono.CSharp.Evaluator (runtime compiling a LINQ query from string)

    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中工作,即使在跟踪 Mono Compiler as a Service (MCS)