2010-11-25 11 views
1

空の検索パラメータを短絡LINQののIQueryableは短い、私は次のような方法で、一般的なリポジトリを持って

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

私は今、一個の以上のパラメータがあったかもしれないフロントエンドを介して、検索機能を提供しようとしています入力または空白のままにします。空のパラメータの式を短絡する問題があります。

問題は、リポジトリ上で、次の例を呼び出すことによって証明することができる。paramnullある場合ToList()でクエリを列挙

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

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

System.NullReferenceExceptionをスローします。

私はこれを理解していないし、それを修正する方法も分かっていないので、どんなポインタでも分かります。ありがとう。

更新:以下のコメントに対する回答として、私はヌルチェックを追加しました。実際のコードは次のようになります。

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 

私はまだ問題がどこにあるか分かりません。

EDIT:応答でコメントする、一般的なリポジトリGetAllByFilterコード:

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

ノート私は同じテーブルの上に

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

シンプルGetAllクエリ、無nullレコードを実行する場合は、その(期待通りに)返されます。

+1

を? –

+0

私はそう信じていませんが、nullでない文字列がparamとして渡される限り、クエリは正常に実行されます。私はfがどのようにnullになるのか見ていないのですか? – fearofawhackplanet

+2

@fearofawhackplanet - 'f'がnullになる唯一の方法は' _fooRepository'がヌル項目を返した場合です。そうでないと確信していますか? – GenericTypeTea

答えて

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表現を静的にすることができます。

+1

かなり醜い... –

2

はそれをシンプルに保つ:、音の権利をdoesntのあなたは「F」パラメータがnullのとき機会がアレントことを確信している、と「f.Something」の例外がスローされます

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(); 
} 
+0

質問が作成されたときに、「GetAll()」メソッドはありませんでした。あなたがアプリケーションのすべての部分を変更することが許可されている1人のプロジェクトだと仮定するのは簡単ではありません。 –

関連する問題