1

次の方法で汎用リポジトリを持っています

IQueryable<T> GetAllByFilter(Expression<Func<T, bool>> expression);

現在、1 つ以上のパラメーターが入力されているか、空白のままになっている可能性があるフロント エンドを介して検索機能を提供しようとしています。空のパラメータの式をショートサーキットするのに問題があります。

この問題は、リポジトリで次の例を呼び出すことで実証できます。

public IEnumerable<Foo> Search(string param)
{
    var filteredFoos = _fooRepository.GetAllByFilter(
          f => string.IsNullOrEmpty(param) || f.Something == param );

    return filteredFoos.ToList(); // throws exception
}

を使用してクエリを列挙すると、 if is がToList()スローされます。System.NullReferenceExceptionparamnull

私はこれを理解しておらず、修正方法も知らないため、ポインタをいただければ幸いです。ありがとう。

更新:以下のコメントに応えて、null チェックを追加しました。私の実際のコードは次のようになります

var test1 = _repository.GetAllByFilter(
     r => r != null && 
         (string.IsNullOrEmpty(param) 
              || (r.Field != null && r.Field.IndexOf(param.Trim()) != -1)));

var test2 = test1.ToList(); // exception here

問題がどこにあるのか、まだわかりません。

編集:コメントへの応答として、一般的なリポジトリGetAllByFilterコード:

public IQueryable<T> GetAllByFilter(Expression<Func<T, bool>> expression)
{
    return _dataContext.GetTable<T>().Where(expression);
}

簡単なGetAllクエリを実行すると

public IQueryable<T> GetAll()
 {
     return _dataContext.GetTable<T>();
 }

同じテーブルで、null(予想どおり) レコードが返されません。

4

2 に答える 2

2

複雑にしないでおく:

public IEnumerable<Foo> Search(string param)
{
    if (string.IsNullOrEmpty(param))
    {
        return this.fooRepository.GetAll().ToArray();
    }

    return this.fooRepository.GetAllByFilter(o => o.Field.Contains(param.Trim())).ToArray();
}
于 2011-05-20T05:37:41.320 に答える
0

ケーキ。

    public IEnumerable<Foo> Search(string param)
    {
        Expression<Func<Foo, bool>> shortCircuit = a => true;
        Expression<Func<Foo, bool>> normal = a => a.Something == param;

        var filteredFoos = _fooRepository.GetAllByFilter(
            string.IsNullOrEmpty(param) ? shortCircuit : normal);

        return filteredFoos.ToList(); // no more exception.
    }

覚えておかなければならないのは、これらの IQueryable メソッドに何かを投げて、それらが理解することを期待することはできないということです。おそらく shortCircuit 式を静的にすることができます。

于 2011-05-20T05:21:10.470 に答える