1

私は MvcMovie チュートリアルを行っていましたが、MoviesController の SearchIndex() 呼び出しを変更して、複数の基準で検索しようとしていました。このチュートリアルでは、次のコードを使用してタイトルとジャンルで検索する方法を示します。

   var movies = from m in db.Movies 
             select m; 

   if (!String.IsNullOrEmpty(searchString)) 
   { 
       movies = movies.Where(s => s.Title.Contains(searchString)); 
   } 

   if (string.IsNullOrEmpty(movieGenre)) 
       return View(movies); 
   else 
   { 
       return View(movies.Where(x => x.Genre == movieGenre)); 
   }

したがって、この権利を読むと、すべての映画が返され、ジャンルでフィルター処理されます。デュアル ケースでは問題ありませんが、3 番目または 4 番目の検索条件を追加すると、if ステートメントの呼び出しの量が 2 倍 (n に対して) - 1 ケース増加します。たとえば、検索する列が 10 個ほどある場合、これは非常に手に負えなくなります。

私は次のようなもう少し単純なものを使用しようとしました:

var movieQry = from m in db.Movies
                where ((m.Title !=null && m.Title == searchString) ||
                       (m.Rating != null && m.Rating == movieRating) ||
                       (m.Genre != null && m.Genre == movieGenre))
                select m;

しかし、最初にページにアクセスしたときは何も返されず、単一のフィルターでのみ機能します (ジャンルを選択した場合-良い結果が得られますが、ジャンルと評価を選択した場合はそうではありません)、検索語を入力しても何も返されませんタイトル用。

達成するためのより簡単な方法はありますか?(ある時点で、私が書いているプロジェクトのために何十ものフィルターを検索できるようにする必要があります...そして、データベースでエントリを検索する方法について他の質問がありますが、そうではないため、正しい方向に進むことができます)。

4

3 に答える 3

5

列がnullでない場合に基準に列を含めたい場合は、次のことを試してください。

  string Title = Request.QueryString["Title"];
  string Rating= Request.QueryString["Rating"];
  string Genre = Request.QueryString["Genre"];

   var movieQry = from m in db.Movies
                    where ((string.IsNullOrEmpty(Title) ? true : m.Title == Title ) &&
                           (string.IsNullOrEmpty(Rating) ? true : m.Rating == Rating ) &&
                           (string.IsNullOrEmpty(Genre)  ? true : m.Genre == Genre ))
                    select m;
于 2012-12-09T06:04:22.677 に答える
4

Behnam は正しい軌道に乗っていました。次のようにコードを変更しました。

var movieQry2 = from m in db.Movies
    where ((string.IsNullOrEmpty(searchString) ? true : m.Title.Contains(searchString)) &&
           (string.IsNullOrEmpty(movieRating) ? true : m.Rating == movieRating) &&
           (string.IsNullOrEmpty(movieGenre) ? true : m.Genre == movieGenre))
    select m;

これは機能し、良い結果が得られます。申し訳ありませんが、ベーナムはあなたに受け入れられた答えを与えることができませんが、私はそれを有用なものとしてチェックしました. 私を正しい方向に向けてくれてありがとう。

于 2012-12-09T14:26:43.580 に答える
0

これを試して:

var movieQry = db.Movies
  .Where(x=> (Title == null || x.Title ==Title)
   && (Rating == null || x.Rating == Rating)
   && (Genre == null || x.Genre == Genre))                       
 .ToList();

その他のページングとソートについては、MVC の複数フィールド検索を参照してください。

于 2015-03-24T18:01:50.413 に答える