我有一个过滤实体列表的通用方法,通过生成lambda表达式来完成过滤:
protected object initFilters<TEntity>(string targetEntity, List<SearchItem> searchItems, int page_size = 20, int offset = 0 , ExpressionSortCriteria<TEntity, string> SortCriteria)
{
var SearchQuery = new SearchQuery<TEntity>();
if (searchItems != null)
{
var predicat = ExpressionBuilder.GetExpression<TEntity>(searchItems).Compile();
SearchQuery.AddFilter(predicat);
}
//SearchQuery.AddSortCriteria(new ExpressionSortCriteria<Profile, string> { SortExpression = (profile => profile.Libelle), Direction = SortDirection.Ascending });
SearchQuery.Skip = offset;
SearchQuery.Take = page_size;
return (object)SearchQuery;
}
我的SearchQuery
包含将应用于列表的条件。
我的谓词是通过这种方式构建的:
public static Expression<Func<T, bool>> GetExpression<T>(IList<SearchItem> filters)
{
some code ...
return Expression.Lambda<Func<T, bool>>(exp, param);
}
我的AddFilter
(在searchQuery
中)是这样的:
public void AddFilter(Expression<Func<TEntity, Boolean>> filter)
{
Filters.Add(filter);
}
我对此行有疑问:
SearchQuery.AddFilter(predicat);
错误:
无法从System.Func转换为System.Linq.Expressions.Expression&gt;
如您所见,我的两种方法正在使用
Expression<Func<T, bool>>
请问如何解决这个问题?
答案 0 :(得分:0)
在你的评论中,你说你做了
var SearchQuery = new SearchQuery<TEntity>();
if (searchItems != null) {
var predicat = ExpressionBuilder.GetExpression<TEntity>(searchItems).Compile();
SearchQuery.AddFilter(predicat);
}
当然,如果你编译你的表达式,它不再是Expression<Func<T, bool>>
而是Func<T, bool>
和AddFilter以Expression<Func<T, bool>>
为参数。
所以......删除Compile()