空の検索パラメータを短絡LINQののIQueryableは短い、私は次のような方法で、一般的なリポジトリを持って
IQueryable<T> GetAllByFilter(Expression<Func<T, bool>> expression);
私は今、一個の以上のパラメータがあったかもしれないフロントエンドを介して、検索機能を提供しようとしています入力または空白のままにします。空のパラメータの式を短絡する問題があります。
問題は、リポジトリ上で、次の例を呼び出すことによって証明することができる。param
がnull
ある場合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
レコードを実行する場合は、その(期待通りに)返されます。
を? –
私はそう信じていませんが、nullでない文字列がparamとして渡される限り、クエリは正常に実行されます。私はfがどのようにnullになるのか見ていないのですか? – fearofawhackplanet
@fearofawhackplanet - 'f'がnullになる唯一の方法は' _fooRepository'がヌル項目を返した場合です。そうでないと確信していますか? – GenericTypeTea