我在服务层有一个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>>()
的最佳解决方案?
答案 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);