0

エンティティのリストをフィルタリングする一般的なメソッドがあります。フィルタリングは、ラムダ式を生成することによって行われます。

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;
}

MySearchQueryには、リストに適用される基準が含まれています。

私の述語は、この方法でメソッドによって構築されます:

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 に変換できません>

ご覧のとおり、私の2つの方法は使用しています

Expression<Func<T, bool>>

これを解決する方法を教えてください。

4

1 に答える 1

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>>as 引数を取ります。

だから...削除Compile()

于 2013-05-16T20:48:25.310 に答える