如何将谓词作为变量传递给Expression <func <t>&gt;

时间:2017-10-26 15:53:09

标签: c# entity-framework

我在服务层有一个Get()功能:

IEntityService:

IEnumerable<T> GetAllQuerable(Expression<Func<T, bool>> filter = null,
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
string includeProperties = "");

EntityService:

public IEnumerable<T> GetAllQuerable(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, string includeProperties = "")
{
    return _repository.Get(filter, orderBy, includeProperties);
}

我通常用这样的显式谓词来调用这个方法:

var result = _myModelService.Get(x => x.myPropery =="someValue").OrderByDescending(x => x.Date);

现在我想将谓词作为变量传递给Get()。在找到这个后,我发现我可以创建一个Predicate<T>,但我仍然无法将谓词传递给Get()方法。

什么是将谓词作为变量传递给Expression<Func<T>>()的最佳解决方案?

2 个答案:

答案 0 :(得分:2)

如果你真的需要一个表达式树(对于SQL),你就不能作弊并让它调用一个不透明的委托。 EF无法将Elements elements = doc.select("ul.header-list > li.location"); 转换为SQL。

您需要在任何地方使用表达式树。

答案 1 :(得分:1)

只要您使用表达式树创建变量,您应该能够将它传递给所有您喜欢的内容:

public IEnumerable<MyType> GetFromRepository(Expression<Func<MyType, bool>> filter)
{
    _myModelService.Get(filter)
                   .OrderByDescending(x => x.Date);
}

// later....

Expression<Func<MyType, bool>> myFilter = x => x.myProperty == "someValue";

GetFromRepository(myFilter);