1. 程式人生 > >學習ASP.NET Core Razor 編程系列九——增加查詢功能

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

方法的參數 將在 代碼 教程 ali 表示 得到 asp.net context

學習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 編程系列五——Asp.Net Core Razor新建模板頁面

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

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

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

在這一篇教程中我們學習如何增加查詢功能,我們將在書籍列表頁面中添加搜索功能,通過按“書籍名稱”或“作者”來搜索書籍。

一、根據書籍名稱查詢

使用下面的代碼來修改書籍列表頁面的 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處。

技術分享圖片

二、根據作者查詢

在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());

二、 添加作者查詢條件

在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">

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

技術分享圖片

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