2016-08-03 2 views
0

У меня есть метод, как это (очень упрощенный вариант):Как вызвать метод без параметров, который возвращает выражение <Func <Model, String >>?

public static Expression<Func<MyModel, String>> GetSomeStatus() 
{ 
    return myModel => myModel.IsTrue ? "That's true" : "That's false"; 
} 

Итак, как я могу назвать его в заявлении, как это:

var efRequest = db.Table1.Where(...) 
          .Select(x => new MyAnotherModel 
          { 
           Status = ""; // call GetSomeStatus() here; x is of MyModel type 
          }) 

Примечание: Мой первоначальный вопрос был вызвать некоторый вспомогательный метод, который возвращает String внутри метода Select, но, конечно, у меня есть исключение, такое как Linq to entities doesn't recognize this method..., поэтому я попытался переписать его (см. пример выше), но теперь я просто не понимаю, как его называть (я относительно новый в EF). Я знаю про простой AsEnumerable вызов до Select, который решает мою первоначальную проблему, но я хочу сохранить этот запрос как IQueryable для последующих целей.

+0

Обычно вы не можете. Можете ли вы использовать сторонние библиотеки? –

+0

Иван, я мог бы попробовать. Если вы знаете, пожалуйста, поделитесь со мной. –

ответ

1

Невозможно из коробки. Но вы можете использовать, например, LINQKitAsExpandable и Invoke методы расширения, как это:

Прежде всего, необходимо сохранить выражение в переменной, в противном случае вы получите знаменитый Linq to entities doesn't recognize this method... исключение:

var getSomeStatus = GetSomeStatus(); 

, а затем использовать это внутри запроса (после вызова AsExpandable, поэтому полученное выражение запроса дерево правильно постобработки):

var efRequest = db.Table1.AsExpandable() 
    .Where(...) 
    .Select(x => new MyAnotherModel 
    { 
     Status = getSomeStatus.Invoke(x) 
    }); 
Смежные вопросы