学习ASP.NET Core Blazor编程系列十五——查询

打印 上一主题 下一主题

主题 534|帖子 534|积分 1602

学习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应用程序中,我们经常使用元素创建表单,在表单中添加 元素, 有一个 type 属性,用于指定输入的类型及其显示方式(作为数字、文本框、单选按钮、复选框、按钮等),让用户输入数据,在用户提交表单时进行数据验证。如果验证成功,则可以执行相应的操作(新增,更新,删除等)。

         那么Blazor应用程序中如何进行数据输入呢,Blazor也提供了一个类似表单的组件—— 组件。此外,Blazor提供了一系列专用输入元素,这些元素可用于格式化和验证用户输入的数据。

          我们首先在已经打开的BookIndex.razor文件中顶部位置的输入获取查询条件的代码。代码如下:
  1. @page "/BookIndex"
  2. @using BlazorAppDemo.Models
  3. @using Microsoft.EntityFrameworkCore
  4. @inject IDbContextFactory<BookContext> dbFactory
  5. @inject NavigationManager NavigationManager
  6.  
  7. <PageTitle>图书列表</PageTitle>
  8. <h3>图书列表</h3>
  9. <EditForm Model=@books>
  10.   
  11.     <span class="input-group-text" id="inputGroup-sizing-default">图书名称:</span>
  12.       
  13.     <InputText @bind-Value=Name class="form-control" aria-describedby="inputGroup-sizing-default"></InputText>
  14.         <ValidationMessage For="@(() =>Name)" />
  15.     
  16.              <button id="search" class="btn btn-outline-secondary" @onclick="Query">查询</button>
  17.   
  18.    
  19.     </EditForm>
  20. <table class="table-responsive" width="90%"> 
  21.     <tr><td>书名</td>
  22.     <td>作者</td>
  23.     <td>价格</td>
  24.     <td>出版日期</td>
  25.     <td>库存数量</td>
  26.    <td>已租数量</td>
  27.     <td>操作</td>
  28.     </tr>
  29.     @foreach (var item in books)
  30.     {
  31.         <tr> 
  32.         <td>@item.Name</td>
  33.         <td>@item.Author</td>
  34.         <td>@item.Price</td>
  35.         <td>@item.ReleaseDate.ToShortDateString()</td>
  36.         <td>@item.StockQty</td>
  37.         <td>@item.Qty</td>
  38.             <td><a target="_blank" href="https://www.cnblogs.com/AddBook?Id=@item.ID">编辑</a>
  39.                 <button id="edit" class="btn btn-primary" @onclick="@(e => EditBook(e, @item.ID))">修改</button>
  40.             </td>
  41.     </tr>
  42.     }
  43. </table>
复制代码
         2.然后在Visual Studio 2022的文本编辑器中,拖拉滚动条,来到BookIndex.razor文件中@code的位置,添加一个书籍名称(Name)的属性和一个查询方法,具体代码如下:
 
  1. private   static BookContext _context;
  2.     private List<Book> books = new List<Book>();
  3.     public string Name{get ;set;}
  4.  
  5.     protected override async Task OnInitializedAsync()
  6.     {
  7.         _context = dbFactory.CreateDbContext();
  8.         books=_context.Book.ToList();
  9.         await base.OnInitializedAsync();
  10.     }
  11.     public void EditBook(MouseEventArgs e ,int Id)
  12.     {
  13.         NavigationManager.NavigateTo("/AddBook?Id="+Id.ToString());
  14.     }
  15.     public void Query()
  16.     {
  17.         var qryBooks = from m in _context.Book
  18.                          select m; 
  19.             if (!String.IsNullOrEmpty(Name))
  20.             {
  21.                 qryBooks = qryBooks.Where(s => s.Name.Contains(Name.Trim()));
  22.             }
  23.             books = qryBooks.ToList();        
  24.     }
复制代码
         在上面的Query查询方法的第一行创建了 LINQ 查询用于选择书籍:
  1. var books = from m in _context.Book
  2.                          select m;
复制代码
         这一行代码仅仅是对查询进行了定义,还没有到传给数据库让数据库去执行。

         如果 Name参数包含一个查询条件字符串,则查询语句会根据查询条件字符串进行修改,代码如下:
  1. if (!String.IsNullOrEmpty(Name))
  2.             {
  3.                 qryBooks = qryBooks.Where(s => s.Name.Contains(Name.Trim()));
  4.             }
复制代码
           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文件的顶部位置,我们添加一个作者查询条件。代码如下。
  1. @page "/BookIndex"
  2. @using BlazorAppDemo.Models
  3. @using Microsoft.EntityFrameworkCore
  4. @using Microsoft.AspNetCore.Mvc.Rendering;
  5. @inject IDbContextFactory<BookContext> dbFactory
  6. @inject NavigationManager NavigationManager
  7.  
  8. <PageTitle>图书列表</PageTitle>
  9. <h3>图书列表</h3>
  10. <EditForm Model=@books>
  11.  
  12.  
  13.    
  14.     <span class="input-group-text" for="inputGroupSelectAuthor">作者:</span>
  15.       
  16.       <InputSelect @bind-Value=Author id="inputGroupSelectAuthor" class="custom-select">
  17.           <option value="">请选择作者</option>
  18.           @foreach (var item in Authors)
  19.           {
  20.                 <option value=@item.Text>@item.Text</option>
  21.           }
  22.    
  23.           </InputSelect>
  24.    
  25.     <span class="input-group-text" id="inputGroup-sizing-default">图书名称:</span>
  26.       
  27.     <InputText @bind-Value=Name class="form-control" aria-describedby="inputGroup-sizing-default"></InputText>
  28.         <ValidationMessage For="@(() =>Name)" />
  29.          
  30.              <button id="search" class="btn btn-outline-secondary" @onclick="Query">查询</button>
  31.    
  32.    
  33.     </EditForm>
  34. <table class="table-responsive" width="90%"> 
  35.     <tr><td>书名</td>
  36.     <td>作者</td>
  37.     <td>价格</td>
  38.     <td>出版日期</td>
  39.     <td>库存数量</td>
  40.     <td>已租数量</td>
  41.     <td>操作</td>
  42.  
  43.     </tr>
  44.     @foreach (var item in books)
  45.     {
  46.         <tr> 
  47.         <td>@item.Name</td>
  48.         <td>@item.Author</td>
  49.         <td>@item.Price</td>
  50.         <td>@item.ReleaseDate.ToShortDateString()</td>
  51.         <td>@item.StockQty</td>
  52.         <td>@item.Qty</td>
  53.             <td><a target="_blank" href="https://www.cnblogs.com/AddBook?Id=@item.ID">编辑</a>
  54.                 <button id="edit" class="btn btn-primary" @onclick="@(e => EditBook(e, @item.ID))">修改</button>
  55.             </td>
  56.     </tr> 
  57.     }
  58. </table>
复制代码
          2.然后在Visual Studio 2022的文本编辑器中,拖拉滚动条,来到BookIndex.razor文件中@code的位置,添加一个作者(Author)的属性和一个SelectList类型的作者列表变量Authors,同时添加一个查询作者的方法BindAuthor,并对Query查询方法进行修改。具体代码如下:
 
  1. @code {    private   static BookContext _context;    private List books = new List();    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
  2.                                              orderby m.Author
  3.                                              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))
  4.             {
  5.                 qryBooks = qryBooks.Where(s => s.Name.Contains(Name.Trim()));
  6.             }        if (!String.IsNullOrEmpty(Author))        {            qryBooks = qryBooks.Where(x => x.Author == Author);         }            books = qryBooks.ToList();           }
复制代码
        SelectList Author 包含作者列表,方便用户在界面上选择一位作者。

       我们通过以下代码使用一个LINQ 查询的语句,可以从数据库中查询所有作者。
  1. IQueryable<string> AuthorQuery = from m in _context.Book
  2.                                              orderby m.Author
  3.                                              select m.Author;
复制代码
          作者列表 SelectList 是通过以下语句进行创建。           
  1. Authors = new SelectList(AuthorQuery.Distinct().ToList());       
复制代码
         Author属性包含用户选择的特定作者(例如“梁桐铭”)。

        3. 在Visual Studio 2022的菜单栏上,找到“调试à开始调试”或是按F5键,Visual Studio 2022会生成BlazorAppDemo应用程序,并在浏览器中打开Home页面,我们使用鼠标点击左边的菜单栏上的“图书列表”菜单项,会进入“图书列表”页面,如下图。

 

      4.在浏览器的作者查询条件中,我们从下拉列表中选择“梁桐铭”,然后点击“查询”按钮。如下图。


 
 

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表