次の方法で汎用リポジトリを持っています
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.NullReferenceException
param
null
私はこれを理解しておらず、修正方法も知らないため、ポインタをいただければ幸いです。ありがとう。
更新:以下のコメントに応えて、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
(予想どおり) レコードが返されません。