목표
검색 기능 추가
검색 기능을 추가하기 위해 MoviesController로 이동하자.
Controllers>MoviesController - Index 원본 (이하 A)
public ActionResult Index()
{
return View(db.Movies.ToList());
}
수정 후 (이하 B)
public ActionResult Index(string searchString)
{
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
return View(movies);
}
Index를 원본에서 고작 몇 줄 추가한 것으로 검색 기능을 사용할 수 있게 되었다.
A에서는
return View(db.Movies.ToList());
명령이 실행되며 데이터베이스의 Movies 테이블의 모든 데이터가 출력되는 것을 알 수 있었다.
수정된 Edit 에서는 매개변수로 string 타입의 searchString을 추가되었다.
public ActionResult Index(string searchString)
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
그리고 searchString 값이 Null 이나 Empty가 아닌 경우 movies라는 변수는 movies.Where(s => s.Title.Contains(searchString)); 을 실행하는 명령이 추가되었다.
검색어 추가 기능을 파헤치기 이전에 구조를 우선 먼저 생각해보자. 검색은 출력될 내용에 필터를 장착하는 것이다. 기존에는 모든 영화 데이터를 출력하였다면, 검색이라는 필터를 사용하여 그에 해당하는 데이터만 불러올 것이고 우리는 그 데이터를 데이터베이스에서 가져온다.
그렇다면 위에서는 데이터베이스 명령이 실행되는것을 예상할 수 있다.
그리고 데이터베이스에 대한 명령이 실행되는 것이라면 movie.Where은 데이터베이스에서 사용하는 쿼리 Where과 같다는 것을 가정할 수 있다.
s => s.Title.Contains(searchString) 는 WHERE뒤에 올 구문이 될 것인데 Contains는 포함하다 라는 의미이다.
데이터베이스에서 포함과 관련된 함수는 LIKE가 있다. 결국 위의 코드를 해석하면
WHERE s.Title = LIKE '%'+searchString+'%'
s를 매개변수로 받아서 WHERE문을 실행하는 것이다. 그리고 그 s에 해당하는 값은 movies이고 그 위에서
movies는 변수로서 선언되고 있다.
var movies = from m in db.Movies
select m;
movies는 값으로서 FROM과 SELECT 절을 가지고 있는것으로 보아 DB 명령임을 쉽게 알 수 있다.
하지만 일반적인 쿼리와는 다르기 때문에 이해를 돕기위해 일부러 해석을 해주겠다.
FROM m in db.Movies 는 FROM Movies AS m와 같다.
movie 라는 함수에 m이라는 별칭을 준 것이다.
SELECT m; 은 SELECT m.* 과 같다.
m이라고 별칭을 주었기 때문에 m.*으로 출력이 가능하며 *(아스트리크)는 모든 칼럼을 가진다.
movies 가 가진 변수값(쿼리)를 해석해서 적으면
SELECT m.*
FROM Movies m
가 되고 searchString의 값이 Null 또는 Empty가 아닐 때 실행되는 쿼리문은 아래와 같다.
WHERE s.Title = LIKE '%'+searchString+'%'
위의 두 쿼리의 완성본
SELECT *
FROM (
SELECT m.*
FROM Movies AS m) AS s
WHERE s.Title = LIKE '%'+searchString+'%'
url로 파라메터값을 받아서 데이터베이스에 연결한 뒤 매개변수를 보내고 데이터베이스에서 필터링한 값을 받아와 View로 출력해주는 로직이 아주 짧은 코드를 추가하는 것만으로 실행이 된다. 테스트해보자
https://localhost:44368/Movies
searchString을 입력하지 않았을 때 출력결과
https://localhost:44368/Movies?searchString=봉
searchString 값으로 '봉'을 입력한 출력 결과
위에서는 searchString 값을 파라미터로 입력하여 데이터를 전송하였다면 아래에서는 좀 더 간편한 방법으로 데이터를 보내기 위한 방법을 사용해보자.
public ActionResult Index(string id)
{
string searchString = id;
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
return View(movies);
}
매개변수를 searchString에서 id로 변경하였다.
우리는 지난 시간 App_Start.RouteConfig.cs 에서 Default url 입력 방식이
{controller}/{action}/{id}
으로 실행되는 것을 확인한 바 있다.
그렇기 때문에 받는 인자 값을 id로 변경한 경우 url 입력 시 'Movies?searchString=봉' 대신 'Movies/Index/봉' 으로 입력하여 명령을 실행이 가능하다.
하지만 사용자 입장에서는 검색 시 url창을 사용하지 않는다. 우리는 사용자를 위해서 원래의 상태로 돌아갈 것이다.
public ActionResult Index(string searchString)
{
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
return View(movies);
인덱스 페이지에 검색 박스를 추가하여 좀 더 간편하게 검색을 할 수 있도록 하자.
Views>Movies>Index.cshtml 원본
수정
//업데이트 된 내용
@using (Html.BeginForm())
{
<p> Title: @Html.TextBox("SearchString")
<input type="submit" value="Filter" /> </p>
}
실행결과
검색 박스가 생겼다.
'봉' 검색 결과
이제는 url에 serarchString 파라메터값으로 또는 인덱스 페이지가 제공하는 검색 박스를 사용해서 검색이 가능하다.
장르별 검색 추가
컨트롤러에 기능 추가
Controller>MoviesController - Index
위 그림에서 알 수 있듯이 Index 페이지가 받을 수 있는 매개변수중 movieGenre 가 추가 되었다.
//추가된 내용
var GenreList = new List<String>();
var GenreQry = from d in db.Movies
orderby d.Genre
select d.Genre;
GenreList.AddRange(GenreQry.Distinct());
ViewBag.movieGenre = new SelectList(GenreList);
if (!String.IsNullOrEmpty(movieGenre))
{
movies = movies.Where(x => x.Genre == movieGenre);
}
GenreList 라는 이름의 List<string> 객체가 생성되고 GenreQry 는 데이터베이스에 입력될 쿼리문이다.
movieGenre 값이 Null이나 Empty가 아닐 경우 쿼리문을 실행하라는 조건문도 추가되어있다. 앞에서 쿼리를 해석하는법에 대한 설명이 있었으므로 뒤에서는 쿼리를 해석하지 않을것이다. 스스로 해석해보길 바란다.
인덱스 페이지(View)에 선택항목 생성
Views>Models>Index.cshtml
@Html.DropDownList("movieGenre", "All")
movieGenre
'정리' 카테고리의 다른 글
MS-SQL 테이블명 검색, 컬럼명 검색 (0) | 2020.03.30 |
---|---|
[MSSQL] 테이블 수정 기본설정 변경 (0) | 2020.03.27 |
ASP.NET MVC 자습서(6) - 편집 메서드 및 편집 보기 검사 (0) | 2020.03.20 |
ASP.NET MVC 자습서(5) - 컨트롤러에서 모델의 데이터에 엑세스 (2) | 2020.03.20 |
ASP.NET MVC 자습서(4) -연결 문자열 만들기 및 SQL Server LocalDB 사용 (0) | 2020.03.20 |