0

私はC#2010 .NET 4.0を使用しており、動的LINQクエリを構築する必要があるというList<T>コレクションがあります。returns

ここで参照されている述語ビルダーを利用しています。

これは、フィルター基準が1つある場合は正常に機能しますが、2つ以上ある場合は、query.compile()が呼び出されると、次のエラーが発生します。

タイプ'Check21Tools.IncomingReturn'の変数'tmp'がスコープ''から参照されていますが、定義されていません

コード:

  Expression<Func<Check21Tools.IncomingReturn, bool>> query = null;

  bool hasFilterItems = false;
  if (filterArray != null)
  {
    foreach (string s in filterArray)
    {
      if (s == string.Empty)
      { break; }
      else
      {
        hasFilterItems = true;
        Int64 id = Int64.Parse(s);
        query = query.Or(tmp => tmp.ID == id);
      }

    }
  }
  if (hasFilterItems)
  {
    returns = returns.Where(query.Compile()).CreateFromEnumerable
                  <Check21Tools.IncomingReturns, Check21Tools.IncomingReturn>();
  } 

コード:

 public static Expression<Func<T, bool>> Or<T>(
     this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
 {
     if (expr1 == null) return expr2;

     return Expression.Lambda<Func<T, bool>>
         (Expression.OrElse(expr1.Body, expr2.Body), expr1.Parameters);

 }
4

1 に答える 1

0

List<T>[OPは]オブジェクトで機能する述語ビルダーの更新されたバージョンに出くわしました:

public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
  {
     if (expr1 == null) return expr2;
     var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
     return Expression.Lambda<Func<T, bool>>
              (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
  }
于 2013-03-20T17:38:52.000 に答える