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)); 
   }

因此,如果我没看错,他们会返回所有电影,然后过滤流派。这对于双重情况​​很好,但是当您添加第三个或第四个搜索条件时,您会将 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

如果您想在条件中包含该列(如果它不为空),请尝试以下操作:

  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;

这有效并产生了良好的结果。抱歉,Behnam 无法给您一个可接受的答案,但我确实认为它很有用。感谢您为我指明正确的方向。

于 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 回答