在这一篇教程中我们学习如何增加查询功能,我们将在书籍列表页面中添加搜索功能,通过按“书籍名称”或“作者”来搜索书籍。

一、根据图书名称查询

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="/AddBook?Id=@item.ID">编辑</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=@item.Text>@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="/AddBook?Id=@item.ID">编辑</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.在浏览器的作者查询条件中,我们从下拉列表中选择“梁桐铭”,然后点击“查询”按钮。如下图。

学习ASP.NET Core Blazor编程系列十五——查询的更多相关文章

  1. 学习ASP.NET Core Blazor编程系列十——路由(中)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  2. 学习ASP.NET Core Blazor编程系列十——路由(上)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  3. 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. 学习ASP.NET Core Razor 编程系列十九——分页

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  5. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  6. 学习ASP.NET Core Razor 编程系列十六——排序

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  7. 学习ASP.NET Core Blazor编程系列八——数据校验

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  8. 学习ASP.NET Core Blazor编程系列九——服务器端校验

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  9. 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  10. 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

随机推荐

  1. avue常用场景记录

    接手的一个项目使用的是avue这个傻瓜式的专门给后端人员用的框架,文档不够友好,使用起来各种蛋疼(咱专业前端基本上不使用).为此,专门记录一下.当前avue版本2.8.12,如果要切换avue的版本, ...

  2. 记录一个奇葩的问题:k8s集群中master节点上部署一个单节点的nacos,导致master节点状态不在线

    情况详细描述; k8s集群,一台master,两台worker 在master节点上部署一个单节点的nacos,导致master节点状态不在线(不论是否修改nacos的默认端口号都会导致master节 ...

  3. 如何优雅的备份MySQL数据?看这篇文章就够了

    大家好,我是一灯,今天一块学习一下如何优雅安全的备份MySQL数据? 1. 为什么要备份数据 先说一下为什么需要备份MySQL数据? 一句话总结就是:为了保证数据的安全性. 如果我们把数据只存储在一个 ...

  4. 华为设备配置telnet远程登陆命令

    user-interface vty 0 4 进入0~4前五个的VTY用户界面进行整体配置 authentication-mode password 设置验证方式为密码 user privilege ...

  5. 强国杯东杯分区赛miscwp

    ​ 目录 不要被迷惑 PCAP文件分析 平正开 不要被迷惑 ​编辑 导出http ​编辑 得到flag.zip后直接爆破密码 ​编辑 得到​编辑 然后一键解码 ​编辑 flag{WImuJeqSNPh ...

  6. LeetCode------找到所有数组中消失的数字(6)【数组】

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array 1.题目 找到 ...

  7. POC、EXP、SRC概念厘清

    「POC」 POC可以看成是一段验证的代码,就像是一个证据,能够证明漏洞的真实性,能证明漏洞的存在即可.     https://zhuanlan.zhihu.com/p/26832890 「EXP」 ...

  8. 只能用于文本与图像数据?No!看TabTransformer对结构化业务数据精准建模

    作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 TensorFlow 实战系列:https://www.showmeai ...

  9. TensorFlow?PyTorch?Paddle?AI工具库生态之争:ONNX将一统天下

    作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 本文地址:https://www.showmeai.tech/artic ...

  10. zk系列三:zookeeper实战之分布式锁实现

    一.分布式锁的通用实现思路 分布式锁的概念以及常规解决方案可以参考之前的博客:聊聊分布式锁的解决方案:今天我们先分析下分布式锁的实现思路: 首先,需要保证唯一性,即某一时点只能有一个线程访问某一资源: ...