學習ASP.NET Core Blazor編程系列十五——查詢

来源:https://www.cnblogs.com/chillsrc/archive/2022/12/04/16949748.html
-Advertisement-
Play Games

一:背景 1.講故事 這周有個朋友找到我,說他的程式出現了記憶體緩慢增長,沒有回頭的趨勢,讓我幫忙看下到底怎麼回事,據朋友說這個問題已經困擾他快一周了,還是沒能找到最終的問題,看樣子這個問題比較刁鑽,不管怎麼說,先祭出 WinDbg。 二:WinDbg 分析 1. 托管還是非托管泄露 一直關註這個系列 ...


學習ASP.NET Core Blazor編程系列一——綜述 學習ASP.NET Core Blazor編程系列二——第一個Blazor應用程式(上)
學習ASP.NET Core Blazor編程系列二——第一個Blazor應用程式(完) 學習ASP.NET Core Blazor編程系列三——實體 學習ASP.NET Core Blazor編程系列四——遷移 學習ASP.NET Core Blazor編程系列五——列表頁面 學習ASP.NET Core Blazor編程系列七——新增圖書 學習ASP.NET Core Blazor編程系列八——數據校驗 學習ASP.NET Core Blazor編程系列十——路由(上) 學習ASP.NET Core Blazor編程系列十二——路由(下) 學習ASP.NET Core Blazor編程系列十三——路由(完)  學習ASP.NET Core Blazor編程系列十四——修改

 

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

一、根據圖書名稱查詢

      1. 在Visual Studio 2022的文本編輯器中打開Pages/BookIndex.razor文件。

        在以往經典的Web應用程式中,我們經常使用<form>元素創建表單,在表單中添加<input> 元素,<input> 有一個 type 屬性,用於指定輸入的類型及其顯示方式(作為數字、文本框、單選按鈕、覆選框、按鈕等),讓用戶輸入數據,在用戶提交表單時進行數據驗證。如果驗證成功,則可以執行相應的操作(新增,更新,刪除等)。

         那麼Blazor應用程式中如何進行數據輸入呢,Blazor也提供了一個類似表單的組件——<EditForm> 組件。此外,Blazor提供了一系列專用輸入元素,這些元素可用於格式化和驗證用戶輸入的數據。

          我們首先在已經打開的BookIndex.razor文件中頂部位置的輸入獲取查詢條件的代碼。代碼如下:

@page "/BookIndex"
@using BlazorAppDemo.Models
@using Microsoft.EntityFrameworkCore


@inject IDbContextFactory<BookContext> dbFactory
@inject NavigationManager NavigationManager

 

<PageTitle>圖書列表</PageTitle>


<h3>圖書列表</h3>
<EditForm Model=@books>

<div class="input-group mb-3">  <div class="input-group-prepend">
    <span class="input-group-text" id="inputGroup-sizing-default">圖書名稱:</span>
      </div>

    <InputText @bind-Value=Name class="form-control" aria-describedby="inputGroup-sizing-default"></InputText>
        <ValidationMessage For="@(() =>Name)" />
    
             <button id="search" class="btn btn-outline-secondary" @onclick="Query">查詢</button>
  
    </div>
    </EditForm>

<table class="table-responsive" width="90%"> 
    <tr><td>書名</td>

    <td>作者</td>
    <td>價格</td>
    <td>出版日期</td>
    <td>庫存數量</td>
   <td>已租數量</td>
    <td>操作</td>

    </tr>

    @foreach (var item in books)
    {
        <tr> 

        <td>@item.Name</td>
        <td>@item.Author</td>
        <td>@item.Price</td>

        <td>@item.ReleaseDate.ToShortDateString()</td>
        <td>@item.StockQty</td>

        <td>@item.Qty</td>

            <td><a href="/[email protected]">編輯</a>

                <button id="edit" class="btn btn-primary" @onclick="@(e => EditBook(e, @item.ID))">修改</button>
            </td>
    </tr>
    }
</table>
         2.然後在Visual Studio 2022的文本編輯器中,拖拉滾動條,來到BookIndex.razor文件中@code的位置,添加一個書籍名稱(Name)的屬性和一個查詢方法,具體代碼如下:

 

private   static BookContext _context;
    private List<Book> books = new List<Book>();
    public string Name{get ;set;}

 

    protected override async Task OnInitializedAsync()
    {
        _context = dbFactory.CreateDbContext();
        books=_context.Book.ToList();
        await base.OnInitializedAsync();

    }

    public void EditBook(MouseEventArgs e ,int Id)
    {
        NavigationManager.NavigateTo("/AddBook?Id="+Id.ToString());

    }

    public void Query()
    {
        var qryBooks = from m in _context.Book
                         select m; 

            if (!String.IsNullOrEmpty(Name))
            {
                qryBooks = qryBooks.Where(s => s.Name.Contains(Name.Trim()));

            }
            books = qryBooks.ToList();        
    }

         在上面的Query查詢方法的第一行創建了 LINQ 查詢用於選擇書籍:

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

         這一行代碼僅僅是對查詢進行了定義,還沒有到傳給資料庫讓資料庫去執行。

         如果 Name參數包含一個查詢條件字元串,則查詢語句會根據查詢條件字元串進行修改,代碼如下:

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

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

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

        3.在Visual Studio 2022的菜單欄上,找到“調試à開始調試”或是按F5鍵,Visual Studio 2022會生成BlazorAppDemo應用程式,併在瀏覽器中打開Home頁面,我們使用滑鼠點擊左邊的菜單欄上的“圖書列表”菜單項,會進入“圖書列表”頁面,如下圖。

 

       4. 在瀏覽器中的圖書名稱查詢條件輸入框中輸入“JAVA”,然後點擊“查詢”按鈕,系統會根據查詢條件顯示相應的書籍信息。根據查詢條件得到的查詢結果如下圖。 

 

二、根據作者查詢

        1.在Visual Studio 20222的解決方案資源管理器中找到Pages/BookIndex.razor文件的頂部位置,我們添加一個作者查詢條件。代碼如下。

@page "/BookIndex"
@using BlazorAppDemo.Models
@using Microsoft.EntityFrameworkCore

@using Microsoft.AspNetCore.Mvc.Rendering;
@inject IDbContextFactory<BookContext> dbFactory

@inject NavigationManager NavigationManager

 
<PageTitle>圖書列表</PageTitle>


<h3>圖書列表</h3>
<EditForm Model=@books>
 

<div class="input-group mb-3"> 
    <div class="input-group-prepend">

    <span class="input-group-text" for="inputGroupSelectAuthor">作者:</span>
      </div>

      <InputSelect @bind-Value=Author id="inputGroupSelectAuthor" class="custom-select">
          <option value="">請選擇作者</option>

          @foreach (var item in Authors)
          {
                <option value[email protected]>@item.Text</option>
          }
   

          </InputSelect>
    <div class="input-group-prepend">
    <span class="input-group-text" id="inputGroup-sizing-default">圖書名稱:</span>
      </div>

    <InputText @bind-Value=Name class="form-control" aria-describedby="inputGroup-sizing-default"></InputText>
        <ValidationMessage For="@(() =>Name)" />
         
             <button id="search" class="btn btn-outline-secondary" @onclick="Query">查詢</button>
   
    </div>
    </EditForm>

<table class="table-responsive" width="90%"> 
    <tr><td>書名</td>
    <td>作者</td>
    <td>價格</td>
    <td>出版日期</td>
    <td>庫存數量</td>
    <td>已租數量</td>
    <td>操作</td>
 
    </tr>

    @foreach (var item in books)
    {
        <tr> 
        <td>@item.Name</td>
        <td>@item.Author</td>
        <td>@item.Price</td>
        <td>@item.ReleaseDate.ToShortDateString()</td>
        <td>@item.StockQty</td>
        <td>@item.Qty</td>
            <td><a href="/[email protected]">編輯</a>

                <button id="edit" class="btn btn-primary" @onclick="@(e => EditBook(e, @item.ID))">修改</button>
            </td>
    </tr> 
    }
</table>
          2.然後在Visual Studio 2022的文本編輯器中,拖拉滾動條,來到BookIndex.razor文件中@code的位置,添加一個作者(Author)的屬性和一個SelectList類型的作者列表變數Authors,同時添加一個查詢作者的方法BindAuthor,並對Query查詢方法進行修改。具體代碼如下:

 

@code {
    private   static BookContext _context;
    private List<Book> books = new List<Book>();
    private SelectList Authors;
    public string Name{get ;set;}
    public string Author{get ;set;}

 
   protected override async Task OnInitializedAsync()
    {

        _context = dbFactory.CreateDbContext();
        books=_context.Book.ToList();
        BindAuthor();
        await base.OnInitializedAsync();
    }

    public void EditBook(MouseEventArgs e ,int Id)
    {
        NavigationManager.NavigateTo("/AddBook?Id="+Id.ToString());
    }

    public void BindAuthor()
   {
       
            IQueryable<string> AuthorQuery = from m in _context.Book
                                             orderby m.Author
                                             select m.Author;
Authors = new SelectList(AuthorQuery.Distinct().ToList());       

    }

    public void Query()
    {
         var qryBooks = from m in _context.Book
                         select m;
 
            if (!String.IsNullOrEmpty(Name))
            {
                qryBooks = qryBooks.Where(s => s.Name.Contains(Name.Trim()));
            }
        if (!String.IsNullOrEmpty(Author))
        {
            qryBooks = qryBooks.Where(x => x.Author == Author);
 
        }
            books = qryBooks.ToList();       

    }

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

       我們通過以下代碼使用一個LINQ 查詢的語句,可以從資料庫中查詢所有作者。

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

          作者列表 SelectList 是通過以下語句進行創建。           

 Authors = new SelectList(AuthorQuery.Distinct().ToList());       

         Author屬性包含用戶選擇的特定作者(例如“梁桐銘”)。

        3. 在Visual Studio 2022的菜單欄上,找到“調試à開始調試”或是按F5鍵,Visual Studio 2022會生成BlazorAppDemo應用程式,併在瀏覽器中打開Home頁面,我們使用滑鼠點擊左邊的菜單欄上的“圖書列表”菜單項,會進入“圖書列表”頁面,如下圖。

 

      4.在瀏覽器的作者查詢條件中,我們從下拉列表中選擇“梁桐銘”,然後點擊“查詢”按鈕。如下圖。

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 近期在對開發框架安全策略方面進行升級優化,提供一些通用場景的解決方案,本文針對前後端數據傳輸加密進行簡單的分享,處理流程設計如下圖所示,本加密方法對原有項目相容性較好,只需要更換封裝好的加密Ajax請求方法,後端統一攔截判斷是否需要解密即可 生成DESKey 生成的DES加密密鑰一定是8的整數 ...
  • ​ 這裡有個坑 1:轉賬低於5毛會失敗 2:轉賬金額需要自己取整一下,微信官方金額是 分 為單位,換算成 元 時可能會除不盡 { "code":"PARAM_ERROR", "detail":{ "location":"body", "value":7.000000000000001 // 微信金額 ...
  • 普通的切片對迭代器無法實行切片操作 1 from itertools import islice 2 3 4 def func(): 5 for i in [4, 9, 6, 2]: 6 if i % 2 == 0: 7 yield i 8 9 10 f = func() 11 res = isli ...
  • noi 1.5 39 與 7 無 關 的 數 。 1.描述 一個正整數,如果它能被7整除,或者它的十進位表示法中某一位上的數字為7,則稱其為與7相關的數.現求所有小於等於n(n < 100)的與7無關的正整數的平方和. 2.輸入 輸入為一行,正整數n(n < 100) 3.輸出 輸出一行,包含一個整 ...
  • 說明: 1. 本文基於Spring-Framework 5.1.x版本講解 2. 建議讀者對創建對象部分源碼有一定瞭解 概述 這篇講講Spring迴圈依賴的問題,網上講迴圈依賴的帖子太多太多了,相信很多人也多多少少瞭解一點,那我還是把這個問題自己梳理一遍,主要是基於以下出發點: 1. Spring到 ...
  • JZ31 棧的壓入、彈出序列 描述 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序 ...
  • Hello,大家好,又是好久不見,最近太忙了(藉口)。看了下日誌,有 2 個月沒寫文章了。為了證明公眾號還活著,今天必須更新一下了。 在我們的開發過程中,總有那麼些需求是那麼的變態。常規的方案已經無法滿足。比如某些規則非常複雜,而客戶又經常要修改它。那麼我們可能需要把這部分代碼直接做為配置文件提取出 ...
  • 從技術生態發展過程及理念、產品級解決方案理念、產品系統框架及主要功能介紹、產品系統二次開發和應用案例等5個方面進行了主題發言。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...