Я попытался использовать expandoobjects в запросах LINQ, чтобы иметь возможность запрашивать свойства, созданные во время выполнения, например заголовки из файла csv. Это все работало нормально, если вводить запрос LINQ непосредственно в коде, как в примере:Использование динамических объектов в кодированном виде Запросы LINQ
// initialize testdata
List<ExpandoObject> hans = new List<ExpandoObject>();
string[] names = {"Apfel", "Birne", "Banane", "Orange"};
int[] ids = { 1, 2, 3, 4 };
for (int i = 0; i < 4; i++)
{
dynamic horst = new ExpandoObject();
((IDictionary<string, object>)horst).Add("Fruit", names[i]);
((IDictionary<string, object>)horst).Add("ID", ids[i]);
hans.Add(horst);
}
// try some LINQ queries, both are working as intended
var klaus = from dynamic x in hans where x.ID < 3 select x;
//var klaus = hans.Where(x => x.ID < 3).Select(x => x);
Затем я попытался прочитать запрос из командной строки и создать динамический запрос LINQ, используя slighty модифицированную версию evaluant LINQ компилятор.
string expression = System.Console.ReadLine();
LinqCompiler lc = new LinqCompiler(expression);
lc.AddSource<ExpandoObject>("hans", hans);
IEnumerable<ExpandoObject> klaus = (IEnumerable<ExpandoObject>)lc.Evaluate();
Пока, как я не использую WHERE или ORDER BY заявления, все нормально, но если WHERE или ORDER BY включен в запрос, я получаю сообщение об ошибке при компиляции кода CodeDOM в linq компилятор: CS1963: Дерево выражений может не содержать динамическую операцию.
Код для запроса создается с помощью следующей строки:
doRequestMethod.Statements.Add(new CodeMethodReturnStatement(new CodeSnippetExpression(Query)));
Я полагаю, что CodeDOM компилятор строит дерево выражения в каком-то иначе, к тому, как прямой напечатанном в LINQ запросе проанализированных , Любая идея получить это для работы будет рассмотрена, в том числе другие идеи для динамического создания запросов для создаваемых во время выполнения объектов.
Спасибо, это заставило его работать и при изменении вызова метода DoRequest. Он основан на списке List и вызывает toQueryabale() в вашем источнике. 'Список list = new Список (); foreach (источник источника источника в этих источниках) { list.Add (source.Instance); } ' –
Отличный ответ, решена моя проблема. Благодаря! –