Как создать и вернуть выражение <Func - PullRequest
1 голос
/ 09 октября 2010

Я использую Entity Framework 4.
Я хотел бы иметь возможность создать функцию, которая возвращает функцию Expression, которая будет использоваться в лямбда-выражении.

  var ViewModel = _db.Suppliers.Select(model => new { 
                model,SupType = model.SupplierType.SupplierTypeTexts.Where( st => st.LangID == 1)   
            });

Я бы хотел сделать такой звонок

  var ViewModel = _db.Suppliers.Select(model => new { 
                model,SupType = model.SupplierType.GetText() 
            });

Мой частичный класс:

  public partial class SupplierType
    {

       public  Expression<Func<SupplierTypeText, bool>> GetText()
        {
            return p => p.LangID == 1;
        }

Как мне это сделать.

Ответы [ 2 ]

4 голосов
/ 09 октября 2010

Легко. Например, предположим, у вас есть таблица Product , сопоставленная с Products EntitySet в вашем контексте, теперь вы хотите передать предикат и выбрать Product :

Expression<Func<Product, bool>> GetPredicate(int id) {
    return (p => p.ProductID == id);
}

Вы можете вызвать GetPredicate () с идентификатором продукта для фильтрации на основе этого:

var query = ctx.Products.Where(GetPredicate(1)).First();

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

EDIT:
Вы должны изменить свой код следующим образом:

var ViewModel = _db.Suppliers.Select(model => new { 
    model,
    SupType = model.SupplierType.SupplierTypeTexts.Where(GetText()) 
});
public Expression<Func<SupplierTypeText, bool>> GetText() {
    return (stt => stt.LangID == 1);
}
0 голосов
/ 09 октября 2010

Если вы хотите динамически создавать скомпилированное выражение во время выполнения (в отличие от тех, которые жестко закодированы для конкретной модели данных во время компиляции), вам необходимо использовать статические методы в классе Expression .

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