0

作成中の MVC アプリの検索をコーディングしています。オブジェクトのさまざまなプロパティで検索したいと考えています。この特定のケースでは、これは私の予想される動作です:

  • 両方のパラメーターが null または空の場合は、すべてを返します。
  • いずれかのパラメーターに値がある場合は、Contains を使用してそのパラメーターでフィルター処理されたすべてを選択します。

これは私がやっていることです:

var model = _svc.GetList(q => q.Name == (string.IsNullOrEmpty(entity.Name) ? q.Name : entity.Name) &&
                              q.Description ==  (string.IsNullOrEmpty(entity.Description) ? q.Description : entity.Description));

これは、両方のフィールドが null または空の場合はすべての要素を返すか、Name AND/OR Descriptionと完全に一致する任意の要素を返します。

ここで重要なのは、これを として動作させたいということですContains

これを1つのフィールドで機能させることができました:

var model = _svc.GetList(q => (string.IsNullOrEmpty(entity.Name) || 
            q.Name.ToLower().Contains(entity.Name.ToLower()))).ToList();

しかし、Description フィールドを追加すると、NullReferenceException: Object reference not set to an object がスローされます。

確認するために、これを試してみましたが、どちらも機能しませんでした:

var model = (from q in _svc.GetList()
             where (string.IsNullOrEmpty(module.Name) ||
                 q.Name.ToLower().Contains(module.Name.ToLower()))
             select q).ToList();

model = (from q in model
         where (string.IsNullOrEmpty(module.Description) ||
             q.Description.ToLower().Contains(module.Description.ToLower()))
         select q).ToList();
4

2 に答える 2

3

まあ、複数オプションの基準検索の場合は、実行できます (「モジュール」が「検索クラス」であると主張します)。

シンプルで、(私が思うに)より読みやすい。モデルの説明とエンティティ プロパティの null チェックを追加します。

//take all elements
var model = _svc.GetList();

if (!string.IsNullOrEmpty(module.Description))
  model = model.Where(m => 
                     m.Description != null && 
                     m.Description.ToLower().Contains(module.Description.ToLower());

if (!string.IsNullOrEmpty(module.Name))
  model = model.Where(m => 
                     m.Name != null && 
                     m.Name.ToLower().Contains(module.Name.ToLower());

return module.ToList();

ToLower()null の a は NRE を発生させるため、nullチェック!

于 2013-01-17T08:47:45.940 に答える
1

これは少し醜いですが、トリックを行う必要があります。 empty のエントリのために null 参照を取得していますDescription。で行っていることがName手がかりである場合、おそらくq.Description.ToLower().Contains(..)q.Description が null ではないことを確認せずに、このようなことを行っている可能性があります

var model = _svc.GetList(q =>  
     (string.IsNullOrEmpty(entity.Name) || string.IsNullOrEmpty(q.Name) 
       || q.Name.ToLower().Contains(entity.Name.ToLower()))

 && (string.IsNullOrEmpty(entity. Description) || string.IsNullOrEmpty(q. Description) 
       || q.Description.ToLower().Contains(entity. Description.ToLower())))
于 2013-01-17T06:41:58.580 に答える