Использование динамического LINQ для GroupBy в DataTable - PullRequest
0 голосов
/ 09 ноября 2010

Я видел немало способов заставить динамический 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);

Если бы у меня была эта обычная сущность, я мог бы использовать динамический GroupByMany * Mitsu .

Я пытаюсь заставить это работать с обычными данными (не строго типизированными). Есть идеи?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2010

Хорошо, я смог заставить это работать как с отражением, так и с компиляцией кода во время выполнения, используя Mono Compiler as a Service (MCS).Используя вопрос Внедрение переменной в Mono.CSharp.Evaluator (время компиляции запроса LINQ из строки) , я нашел следующее решение (# 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, даже после выполнения Mono Compiler as a Service (MCS) вопрос, но только использование его для создания функции сделало то, что мне было нужно.

0 голосов
/ 09 ноября 2010

Я не думаю, что это возможно; это говорит о том, что вы хотите, чтобы компилятор C # компилировал вашу строку во время выполнения =)
Проблема не в индексаторах «make» и «model», а в членах новых экземпляров, которые вы возвращаете; они могут быть представлены только в текстовом виде Reflection, но я знаю, что LINQ-to-Entities не поддерживает его функции, не уверен, будет ли нормальный LINQ. Вы бы согласились с решением Reflection?
Я хочу знать, если ты в порядке с этим, прежде чем я потрачу два часа, пытаясь заставить его работать =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...