2013-07-30 3 views
1

Как я могу назвать это выражение LinqKitвызовов в динамическом запросе Linq

public static Expression<Func<Transaction, string>> ExpressionOfStatusName 
    { 
     get 
     { 
      Expression<Func<Transaction, string>> status = 
       (transaction) => transaction.TransactionStatus.Name; 
      return status; 
     } 
    } 

в динамическом запросе Linq (Linq в виде строки, используя System.Linq.Dynamic от Microsoft)

Это выражение хорошо работает в стандартном Linq запрос, как этот

Expression<Func<Transaction, string>> expressionOfStatusName = Transaction.ExpressionOfStatusName; 

var ex = from transaction in context.Transaction.AsExpandable() 
     select expressionOfStatusName.Invoke(transaction) 

Но когда я пытаюсь вызвать его из динамического запроса Linq, я получаю сообщение об ошибке «нет применимый метод„Invoke“не существует в типе«Expr ession`1 ' Я попытался добавить импорт linqkit в файл System.Linq.Dynamic, но он все еще не работает.

Я хочу быть в состоянии сделать что-то подобное

var ex = context.Transaction.AsExpandable() 
.Select (transaction=>transaction) 
.Select("new { test = expressionOfStatusName.Invoke(transaction)"); 

Спасибо за вашу помощь

ответ

0

Linq ожидает Экспрессия FUNC. Вы можете использовать расширение MS Linq.Dynamic, которое принимает строки и преобразует их в дерево выражений. Или вы можете использовать любой инструмент, который вам нравится для построения дерева выражений. Однако динамическое linq-расширение MS анализирует ограниченный набор входов String. Some sample docu/blog Вы просите его разобрать expressionOfStatusName.Invoke (транзакции)» Я не думаю, что он может сделать это. Вы можете отлаживать источник проверить. Но я помню, как видим простой анализ членства там. The source is here

Кроме того, я думаю, вы раздвигаете пределы допустимого входного анонимного типа после того, как вы прошли разбор вызов. anonymous types and Linq

+0

Я уже использую MS Linq.Dynamic Я пытаюсь изменить источник, я пытаюсь изменить функцию FindMethod для вызова Метод LinqKit: 'INT FindMethod (Тип, строка имяМетод, BOOL staticAccess, Expression [] арг, из метода MethodBase) { если (имяМетод == "Вызов") { метода = TypeOf (LinqKit.Extensions) .GetMethods() .Where (o => o.Name == "Invoke"). First(); return 1; } [...] ' , но он возвращает ошибку. Методы типа« Расширения »недоступны. – user1756338

+0

Я заметил ..... вы пытались его кормить «new {test = expressionOfStatusName.Invoke (transaction)». Пожалуйста, прочитайте ответ еще раз. Где-то я был неясен? –

Смежные вопросы