生成lambda表达式 - 类型转换错误

时间:2013-05-16 20:19:37

标签: linq lambda linq-to-entities generic-programming

我有一个过滤实体列表的通用方法,通过生成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>>

请问如何解决这个问题?

1 个答案:

答案 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()