37 lines
2.8 KiB
Markdown
37 lines
2.8 KiB
Markdown
|
# Adding Search
|
||
|
|
||
|
By [Rick Anderson](https://twitter.com/RickAndMSFT)
|
||
|
|
||
|
In this section you'll add search capability to the `Index` action method that lets you search movies by *genre* or *name*.
|
||
|
|
||
|
Update the `Index` method with the following code:
|
||
|
<!--
|
||
|
[!code-html[Main](../../tutorials/first-mvc-app/start-mvc/sample/MvcMovie/Views/Shared/_Layout.cshtml?highlight=7,31)]
|
||
|
-->
|
||
|
|
||
|
[!code-csharp[Main](../../tutorials/first-mvc-app/start-mvc/sample/MvcMovie/Controllers/MoviesController.cs?name=snippet_1stSearch)]
|
||
|
|
||
|
The first line of the `Index` action method creates a [LINQ](http://msdn.microsoft.com/en-us/library/bb397926.aspx) query to select the movies:
|
||
|
|
||
|
```csharp
|
||
|
var movies = from m in _context.Movie
|
||
|
select m;
|
||
|
```
|
||
|
|
||
|
The query is *only* defined at this point, it has **not** been run against the database.
|
||
|
|
||
|
If the `searchString` parameter contains a string, the movies query is modified to filter on the value of the search string:
|
||
|
|
||
|
[!code-csharp[Main](../../tutorials/first-mvc-app/start-mvc/sample/MvcMovie/Controllers/MoviesController.cs?name=snippet_SearchNull)]
|
||
|
|
||
|
The `s => s.Title.Contains()` code above is a [Lambda Expression](http://msdn.microsoft.com/library/bb397687.aspx). Lambdas are used in method-based [LINQ](http://msdn.microsoft.com/en-us/library/bb397926.aspx) queries as arguments to standard query operator methods such as the [Where](http://msdn.microsoft.com/en-us/library/system.linq.enumerable.where.aspx) method or `Contains` (used in the code above). LINQ queries are not executed when they are defined or when they are modified by calling a method such as `Where`, `Contains` or `OrderBy`. Rather, query execution is deferred. That means that the evaluation of an expression is delayed until its realized value is actually iterated over or the `ToListAsync` method is called. For more information about deferred query execution, see [Query Execution](http://msdn.microsoft.com/en-us/library/bb738633.aspx).
|
||
|
|
||
|
Note: The [Contains](http://msdn.microsoft.com/library/bb155125.aspx) method is run on the database, not in the c# code shown above. The case sensitivity on the query depends on the database and the collation. On SQL Server, [Contains](http://msdn.microsoft.com/library/bb155125.aspx) maps to [SQL LIKE](http://msdn.microsoft.com/library/ms179859.aspx), which is case insensitive. In SQLlite, with the default collation, it's case sensitive.
|
||
|
|
||
|
Navigate to `/Movies/Index`. Append a query string such as `?searchString=Ghost` to the URL. The filtered movies are displayed.
|
||
|
|
||
|
![Index view](../../tutorials/first-mvc-app/search/_static/ghost.png)
|
||
|
|
||
|
If you change the signature of the `Index` method to have a parameter named `id`, the `id` parameter will match the optional `{id}` placeholder for the default routes set in *Startup.cs*.
|
||
|
|
||
|
[!code-csharp[Main](../../tutorials/first-mvc-app/start-mvc/sample/MvcMovie/Startup.cs?highlight=5&name=snippet_1)]
|