2010-11-08 73 views
0

我已經看到了很多方法讓動態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

我想讓這與常規數據表(不強類型)工作。有任何想法嗎?

回答

0

好吧,我能夠得到這個反應和編譯代碼在運行時使用單聲道編譯器作爲服務(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工作,但是隻是使用它來創建函數,我做了我需要的工作。

0

我不認爲這是可能的;這表明您希望C#編譯器在運行時編譯您的字符串=)
問題不在於「make」和「model」索引器,它是您返回的新實例中的成員;那些只能用Reflection來表示文本,但我知道LINQ-to-Entities不支持它的功能,不知道是否正常的LINQ會。
你可以用反射解決方案嗎?
我想知道,如果你沒事,我花了兩個小時試圖讓它工作=)

+0

我絕對可以用反射解決方案。這顯然是表現的問題,這取決於需要多少。如果每一行的每一列都需要它,我會懷疑這會是一個問題。如果只是一次,沒問題。我相信我們會達到500行左右的最大值。 – DougJones 2010-11-09 00:23:05

+0

你可以給我一個'行'的示例實例嗎?它只是一堆類似的物體嗎? – BeemerGuy 2010-11-09 00:31:48

+0

這是一個數據表。 <%DataTable dt = GetData(); var rows = dt.AsEnumerable(); %> – DougJones 2010-11-09 00:46:07