學習ASP.NET Core Razor 編程系列九——增長查詢功能

學習ASP.NET Core Razor 編程系列目錄html

學習ASP.NET Core Razor 編程系列一java

學習ASP.NET Core Razor 編程系列二——添加一個實體sql

 學習ASP.NET Core Razor 編程系列三——建立數據表及建立項目基本頁面數據庫

學習ASP.NET Core Razor 編程系列四——Asp.Net Core Razor列表模板頁面編程

學習ASP.NET Core Razor 編程系列五——Asp.Net Core Razor新建模板頁面瀏覽器

學習ASP.NET Core Razor 編程系列六——數據庫初始化併發

學習ASP.NET Core Razor 編程系列七——修改列表頁面async

學習ASP.NET Core Razor 編程系列八——併發處理post

 

      在這一篇教程中咱們學習如何增長查詢功能,咱們將在書籍列表頁面中添加搜索功能,經過按「書籍名稱」或「做者」來搜索書籍。學習

1、根據書籍名稱查詢

       使用下面的代碼來修改書籍列表頁面的 OnGetAsync 方法:

public async Task OnGetAsync(string searchString)
        {

            var books = from m in _context.Book
                         select m; 

            if (!String.IsNullOrEmpty(searchString))
            {
                books = books.Where(s => s.Name.Contains(searchString));
            }
            Book = await books.ToListAsync();
          //  Book = await _context.Book.ToListAsync();
        }

        上面代碼中的OnGetAsync 方法的第一行建立了 LINQ 查詢用於選擇書籍:

var books = from m in _context.Book
                         select m;

        這一行代碼僅僅是對查詢進行了定義,尚未到傳給數據庫讓數據庫去執行。

        若是 searchString 參數包含一個查詢條件字符串,則查詢語句會根據查詢條件字符串進行修改,代碼以下:

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

          s => s.Title.Contains() 這段代碼是 Lambda 表達式。 Lambda 在基於方法的 LINQ 查詢中用做標準查詢運算符方法的參數,如 Where 方法或 Contains(前面的代碼中所使用的)。 在對 LINQ 查詢進行定義或經過調用方法(如 Where、Contains 或 OrderBy)進行修改後,此查詢語句不會被當即執行,會延遲執行。 這意味着表達式的計算會延遲,直到循環訪問其實現的值或者調用 ToListAsync 方法。

       注意:Contains 方法在數據庫中運行,而不是在 C# 代碼中運行。 查詢條件是否要區分大小寫取決於你採用什麼樣的數據庫或者你在數據庫中使用什麼樣的排序規則。 在 SQL Server 上,Contains 映射到數據庫查詢語法中的LIKE,這是不區分大小寫的。 在 SQLite 中,若是使用默認排序規則,則查詢條件會區分大小寫。

         在瀏覽器中打開書籍列表頁面,並在瀏覽器的地址欄的URL未尾添加以下字符串 ?searchString=Java (例如 http://localhost:53416/Books?searchString=Java)。 書籍管理系統會根據你輸入的查詢條件顯示相應的書籍列表。下圖中1處是沒有查詢條件下的書籍列表,會顯示所有的書籍信息。而圖中2處,則顯示是的查詢條件爲java的書籍信息列表。

 

        若是在書籍列表頁面中添加了如下路由模板,則查詢條件字符串則可做爲 URL 地址中的一段傳遞給後臺(例如 http://localhost:53416/Books/Java)。

       @page "{searchString?}" 

        上面的路由約束代碼容許把查詢條件放到URL中作爲URL的一段數據來查詢書籍信息。 "{searchString?}" 中的 ? 表示這是可選路由參數。

 

        可是,這樣經過修改URL進行搜索書籍信息的方案對用戶來講很是不友好。因此, 咱們在下面的步驟中,會添加 UI 界面方便用戶來查詢書籍信息。 若是你已經在Index.cshtml頁面中添加路由約束 "{searchString?}",請先將它刪除。

 

        請在Visual Studio 2017的解決方案資源管理器中打開  Pages/Books/Index.cshtml 文件, 在文件中添加一個Form表單,代碼以下:

@page 
@model RazorMvcBooks.Pages.Books.IndexModel

@{
    ViewData["Title"] = "Index";
} 

<h2>Index</h2> 
<p>
    <a asp-page="Create">Create New</a>
</p>

<form>
    <p>
        書籍名稱: <input type="text" name="SearchString">
        <input type="submit" value="Filter" />
    </p>
</form>
<table class="table">

1. 在進行如上代碼修改以後,在瀏覽器中瀏覽可能會出現亂碼,以下圖。

 

2. 對於中文亂碼的解決方案是,在Visual Studio 2017中打開Index.cshtml文件,在菜單中選擇 文件à「Index.cshtml另存爲…」菜單 。以下圖。

 

3. 在彈出對話框的「保存」按鈕,用鼠標點擊下拉箭頭,而後在彈出菜單中選擇「編碼保存…」。以下圖。

 

4. 在彈出對話框中,咱們看到頁面默認使用的是「GB2312」編碼 進行保存的,咱們選擇「UTF-8」編碼進行保存。操做以下圖。

 

5. 在瀏覽器中按F5進行刷新,而後咱們看到中文亂碼沒有了。以下圖。

 

6. 在書籍名稱查詢輸入框中輸入「sql」,而後點擊「查詢」按鈕,系統會根據查詢條件顯示相應的書籍信息。查詢條件會以下圖中1處,自動 添加到Url後面。根據查詢條件獲得的查詢結果以下圖2處。

 

2、根據做者查詢

       在Visual Studio 2017的解決方案資源管理器中找到Pages/Books/Index.cshtml.cs文件,並添加二個變量與一個屬性,代碼以下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using RazorMvcBooks.Models;
using Microsoft.AspNetCore.Mvc.Rendering; 

namespace RazorMvcBooks.Pages.Books
{
    public class IndexModel : PageModel
    {
        private readonly RazorMvcBooks.Models.BookContext _context;

        public IndexModel(RazorMvcBooks.Models.BookContext context)
        {
            _context = context;
        } 

        public List<Book> Books;
        public SelectList Authors;
        public string Author { get; set; }

            SelectList Author 包含做者列表,方便用戶在界面上選擇一位做者。

          Author屬性包含用戶選擇的特定做者(例如「吳軍」)。

         咱們對OnGetAsync 方法進行以下修改。

 

 public async Task OnGetAsync(string author,string searchString)
        { 

            IQueryable<string> AuthorQuery = from m in _context.Book
                                             orderby m.Author
                                             select m.Author; 

            var books = from m in _context.Book
                         select m;
 

            if (!String.IsNullOrEmpty(searchString))
            {
                books = books.Where(s => s.Name.Contains(searchString));
            }     
 
            if (!String.IsNullOrEmpty(author))
            {
                books = books.Where(x => x.Author == author);

            }
            Authors = new SelectList(await AuthorQuery.Distinct().ToListAsync());           

            Book = await books.ToListAsync();
            //  Book = await _context.Book.ToListAsync();
        }

 

        下面的代碼是一個 LINQ 查詢的語句,能夠從數據庫中查詢全部做者。

 

 IQueryable<string> AuthorQuery = from m in _context.Book
                                             orderby m.Author
                                             select m.Author;

       做者列表 SelectList 是經過如下語句進行建立。      

  Authors = new SelectList(await AuthorQuery.Distinct().ToListAsync());

 

2、 添加做者查詢條件

      在Visual Studio 2017的解決方案資源管理器中找到 Index.cshtml文件,並進行以下修改,代碼以下:

@page 

@model RazorMvcBooks.Pages.Books.IndexModel
 
@{

    ViewData["Title"] = "Index";
}


<h2>Index</h2> 

<p>
    <a asp-page="Create">Create New</a>
</p>
<form>
    <p>
        <select asp-for="Author" asp-items="Model.Authors">
            <option value="">All</option>
        </select>
書籍名稱
         <input type="text" name="SearchString">
        <input type="submit" value="查詢" />
    </p>
</form> 

<table class="table">

        經過瀏覽器,參照根據書籍名稱查詢操做,來測試按做者來查詢。以下圖。

 

相關文章
相關標籤/搜索