BootstrapBlazor Table组件 使用的注入 数据服务 实现类:使用 EF Core

news2025/2/11 22:30:29

一、使用示例:UsersManager.razor

注:TLog 相关内容参见 .NET 9.0 的 Blazor Web App 项目、Bootstrap Blazor 组件库、自定义日志 TLog 使用备忘-CSDN博客
 

@page "/Log/TLogManager"

<Table TItem="TLogEntity" DataService="new EfcoreDataService<TLogEntity>(TLog.TLogDb)"
       AutoGenerateColumns=true HeaderStyle="TableHeaderStyle.Light"
       ClickToSelect="true" ShowLoading="true" AllowResizing="true"
       IsPagination="true" PageItemsSource="new int[] { 10, 15, 20, 25, 30, 60, 100 }" PageItems="15"
       ShowToolbar="true" ShowDefaultButtons="false">
</Table>

@code {
     
}

二、数据服务 实现类:EfcoreDataService.cs

using BootstrapBlazor.Components;
using Microsoft.EntityFrameworkCore;
using System.Linq.Dynamic.Core;

namespace BlazorWebAppNet9Shared.Services;

/// <summary>
/// BootstrapBlazor Table组件 使用的注入 数据服务 实现类
/// </summary>
/// <typeparam name="TModel"></typeparam>
/// <param name="dbContext"></param>
public class EfcoreDataService<TModel>(DbContext dbContext) : DataServiceBase<TModel> where TModel : class
{
    /* 查询 */
    public override async Task<QueryData<TModel>> QueryAsync(QueryPageOptions options)
    {
        /* 模拟延时,以便能够看清楚 刷新 按钮转圈 */
        await Task.Delay(200);

        /* 不是翻页:刷新、改变每页条数、过虑,此时,清除跟踪(清除缓存)*/
        if (!options.IsTriggerByPagination)
        {
            dbContext.ChangeTracker.Clear();
        }

        //构造查询
        var efQuery = dbContext.Set<TModel>().AsQueryable();

        /* 列过滤 Filter 处理:内置扩展方法 ToFilterFunc、ToFilterLambda 获得过滤条件 */
        if (options.Filters.Count > 0)
        {
            efQuery = efQuery.Where(options.ToFilterLambda<TModel>());
        }

        /* 搜索:模糊搜索,Searchable = true 列与 SearchText */
        if (options.Searches.Count > 0)
        {
            //逻辑关系使用 FilterLogic.Or
            efQuery = efQuery.Where(options.Searches.GetFilterLambda<TModel>(FilterLogic.Or));
        }

        /* 高级搜索:精确 【测试 ???】 */
        if (options.AdvanceSearches.Count > 0)
        {
            efQuery = efQuery.Where(options.AdvanceSearches.GetFilterLambda<TModel>(FilterLogic.And));
        }

        /* 排序 */
        if (options.SortName != null && options.SortOrder != SortOrder.Unset)
        {
            efQuery = efQuery.OrderBy(options.SortName + " " + options.SortOrder);
        }
        else
        {
            /* 默认 Id 排序:如果 Id 的类型是 GUID ,则排序的结果不是 自然录入顺序 */
            efQuery = efQuery.OrderBy("Id Asc");
        }

        //注:使用分页时,需要在外部处理 排序、过滤、搜索(因为传入的数据只有当前页的)
        //使用 偏移分页(Offset pagination)方式
        IEnumerable<TModel> items = await efQuery.Skip((options.PageIndex - 1) * options.PageItems).Take(options.PageItems).ToListAsync();

        //返回查询结果、列表显示:设置为 true ,表示通知组件外部已处理,传入内容不需要再处理
        return await Task.FromResult(new QueryData<TModel>() { Items = items, TotalCount = efQuery.Count(), IsSorted = true, IsFiltered = true, IsSearch = true, IsAdvanceSearch = true });
    }

    /* 新建:初始化 新建 实体,如无特殊初始化操作,可以不要,使用 Table 组件默认值。
    public override Task<bool> AddAsync(TModel model)
    {
        return base.AddAsync(model);
        //如果对新建的对象有初始处理,在这儿写代码操作,否则不需要重写本方法
        return Task.FromResult(new ApplicationUser() { UserName = "新用户" });
    } */

    // 保存:新建或编辑
    public override async Task<bool> SaveAsync(TModel model, ItemChangedType changedType)
    {
        //return base.SaveAsync(model, changedType);

        bool re = false;
        if (changedType == ItemChangedType.Add)
        {
            try
            {
                dbContext.Set<TModel>().Add(model);
                var x = await dbContext.SaveChangesAsync();
                re = x == 1;
            }
            catch (Exception)
            {
                re = false;
            }
        }
        else
        {
            TModel oldItem = dbContext.Set<TModel>().First(x => x.Equals(model));
            if (oldItem == null)
            {
                // 用户被其它人删除了
                re = false;
            }
            else
            {
                try
                {
                    Utility.Copy(model, oldItem);
                    var x = await dbContext.SaveChangesAsync();
                    re = x == 1;
                }
                catch (Exception)
                {
                    re = false;
                }
            }
        }
        return await Task.FromResult(re);
    }

    /* 删除 */
    public override async Task<bool> DeleteAsync(IEnumerable<TModel> models)
    {
        //return base.DeleteAsync(models);

        /* 一次删除全部记录 */
        try
        {
            dbContext.RemoveRange(models);
            await dbContext.SaveChangesAsync();
            return await Task.FromResult(true);
        }
        catch (Exception)
        {
            return await Task.FromResult(false);
        }
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2296534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chrome-mojo C++ Bindings API

概述 Mojo C 绑定 API 利用C 系统 API提供一组更自然的原语&#xff0c;用于通过 Mojo 消息管道进行通信。结合从Mojom IDL 和绑定生成器生成的代码&#xff0c;用户可以轻松地跨任意进程内和进程间边界连接接口客户端和实现。 本文档通过示例代码片段提供了绑定 API 用法的详…

java: framework from BLL、DAL、IDAL、MODEL、Factory using oracle

oracel 21c sql: -- 创建 School 表 CREATE TABLE School (SchoolId CHAR(5) NOT NULL,SchoolName NVARCHAR2(500) NOT NULL,SchoolTelNo VARCHAR2(8) NULL,PRIMARY KEY (SchoolId) );CREATE OR REPLACE PROCEDURE addschool(p_school_id IN CHAR,p_school_name IN NVARCHAR2,p…

Ubuntu22.04部署deepseek大模型

Ollama 官方版 Ollama 官方版: https://ollama.com/ 若你的显卡是在Linux上面 可以使用如下命令安装 curl -fsSL https://ollama.com/install.sh | shollama命令查看 rootheyu-virtual-machine:~# ollama -h Large language model runnerUsage:ollama [flags]ollama [comman…

Redis数据库(二):Redis 常用的五种数据结构

Redis 能够做到高性能的原因主要有两个&#xff0c;一是它本身是内存型数据库&#xff0c;二是采用了多种适用于不同场景的底层数据结构。 Redis 常用的数据结构支持字符串、列表、哈希表、集合和有序集合。实现这些数据结构的底层数据结构有 6 种&#xff0c;分别是简单动态字…

网络安全溯源 思路 网络安全原理

网络安全背景 网络就是实现不同主机之间的通讯。网络出现之初利用TCP/IP协议簇的相关协议概念&#xff0c;已经满足了互连两台主机之间可以进行通讯的目的&#xff0c;虽然看似简简单单几句话&#xff0c;就描述了网络概念与网络出现的目的&#xff0c;但是为了真正实现两台主机…

BS架构(笔记整理)

楔子.基本概念 1.在网络架构中&#xff1a; 服务器通常是集中式计算资源&#xff0c;负责处理和存储数据&#xff1b;客户机是请求这些服务的终端设备&#xff0c;可能是个人电脑或移动设备&#xff1b;浏览器则是客户机上用来与服务器交互的工具&#xff0c;负责展示网页内容…

06排序 + 查找(D2_查找(D2_刷题练习))

目录 1. 二分查找-I 1.1 题目描述 1.2 解题思路 方法&#xff1a;二分法&#xff08;推荐使用&#xff09; 2. 二维数组中的查找 2.1 题目描述 2.2 解题思路 方法一&#xff1a;二分查找&#xff08;推荐使用&#xff09; 3. 寻找峰值 3.1 题目描述 3.2 解题思路 方…

C++ 设计模式 - 访问者模式

一&#xff1a;概述 访问者模式将作用于对象层次结构的操作封装为一个对象&#xff0c;并使其能够在不修改对象层次结构的情况下定义新的操作。 《设计模式&#xff1a;可复用面向对象软件的基础》一书中的访问者模式因两个原因而具有传奇色彩&#xff1a;一是因为它的复杂性&a…

海云安开发者智能助手(D10)全面接入DeepSeek,赋能开发者安全高效编码新范式

海云安正式宣布完成与DeepSeek&#xff08;深度求索&#xff09;的深度技术融合&#xff0c;旗下核心产品D10开发者智能助手全面接入DeepSeek R1模型。此次合作标志着海云安在"AI驱动开发安全"领域实现重要突破。数据显示&#xff0c;通过DeepSeek R1模型的优化与蒸馏…

分布式id探索

一、为什么要使用分布式id&#xff1f; 随着数据量增加&#xff0c;数据需要进行水平拆分&#xff0c;但表自增id无法满足唯一性&#xff1b; 二、分布式id的特点 1唯一性 2 趋势递增、单调递增&#xff08;数据库中存放的数据结构数据从小到大有序排列&#xff09;&#xff0…

【Linux系统】—— 简易进度条的实现

【Linux系统】—— 简易进度条的实现 1 回车和换行2 缓冲区3 进度条的准备代码4 第一版进度条5 第二版进度条 1 回车和换行 先问大家一个问题&#xff1a;回车换行是什么&#xff0c;或者说回车和换行是同一个概念吗&#xff1f;   可能大家对回车换行有一定的误解&#xff0…

一文学会:用DeepSeek R1/V3 + AnythingLLM + Ollama 打造本地化部署的个人/企业知识库,无须担心数据上传云端的泄露问题

文章目录 前言一、AnythingLLM 简介&基础应用1.主要特性2.下载与安装3.配置 LLM 提供商4.AnythingLLM 工作区&对话 二、AnythingLLM 进阶应用&#xff1a;知识增强使用三、AnythingLLM 的 API 访问四、小结1.聊天模式2.本地存储&向量数据库 前言 如果你不知道Olla…

开源身份和访问管理方案之keycloak(一)快速入门

文章目录 什么是IAM什么是keycloakKeycloak 的功能 核心概念client管理 OpenID Connect 客户端 Client Scoperealm roleAssigning role mappings分配角色映射Using default roles使用默认角色Role scope mappings角色范围映射 UsersGroupssessionsEventsKeycloak Policy创建策略…

C++STL(六)——list模拟

目录 本次所需实现的三个类一、结点类的模拟实现构造函数 二、迭代器类的模拟实现为什么有迭代器类迭代器类的模板参数说明构造函数运算符的重载- -运算符的重载和!运算符的重载*运算符的重载->运算符的重载引入模板第二个和第三个参数 三、list的模拟实现3.1 默认成员函数构…

HTML5--网页前端编程(下)

HTML5–网页前端编程(下) 9.常用标签下 (1)表格标签 用来展示数据,显示数据,规整条理,可读性好 基本语法 <table><tr> <td>单元格内的文字</td> <td>单元格内的文字</td>… </tr> <tr> <td>单元格内的文字&l…

Git 分布式版本控制工具使用教程

1.关于Git 1.1 什么是Git Git是一款免费、开源的分布式版本控制工具&#xff0c;由Linux创始人Linus Torvalds于2005年开发。它被设计用来处理从很小到非常大的项目&#xff0c;速度和效率都非常高。Git允许多个开发者几乎同时处理同一个项目而不会互相干扰&#xff0c;并且在…

linux部署ollama+deepseek+dify

Ollama 下载源码 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz sudo tar -C /usr -xzf ollama-linux-amd64.tgz启动 export OLLAMA_HOST0.0.0.0:11434 ollama serve访问ip:11434看到即成功 Ollama is running 手动安装deepseek…

torch_bmm验算及代码测试

文章目录 1. torch_bmm2. pytorch源码 1. torch_bmm torch.bmm的作用是基于batch_size的矩阵乘法,torch.bmm的作用是对应batch位置的矩阵相乘&#xff0c;比如&#xff0c; mat1的第1个位置和mat2的第1个位置进行矩阵相乘得到mat3的第1个位置mat1的第2个位置和mat2的第2个位置…

CTFHub-RCE系列wp

目录标题 引言什么是RCE漏洞 eval执行文件包含文件包含php://input读取源代码远程包含 命令注入无过滤过滤cat过滤空格过滤目录分隔符过滤运算符综合过滤练习 引言 题目共有如下类型 什么是RCE漏洞 RCE漏洞&#xff0c;全称是Remote Code Execution漏洞&#xff0c;翻译成中文…

从大规模恶意攻击 DeepSeek 事件看 AI 创新隐忧:安全可观测体系建设刻不容缓

作者&#xff1a;羿莉&#xff08;萧羿&#xff09; 全球出圈的中国大模型 DeepSeek 作为一款革命性的大型语言模型&#xff0c;以其卓越的自然语言处理能力和创新性成本控制引领行业前沿。该模型不仅在性能上媲美 OpenAI-o1&#xff0c;而且在推理模型的成本优化上实现了突破…