EF基础入门

news2024/11/17 5:36:58

目录

基础查询

基本单表Select查询

​编辑

数据排序

分页Skip()、 Take()

查询聚合操作符(如 Count、Sum、 Min、Max、Average、Aggregate) 不返回一个序列,而返回一个值。

基本单表分页

 基本单表 in / not in

内连接Join

左连  GroupJoin

分组查询Group By 

内连+分组查询Group By 

---------------------实际业务中--------没那么简单,下列举个比较复杂的例子  

  linqA表左连B表,再B表内连C表 

待解决问题, 左连+分组 无法生成 Group By sql语句,全表提交了

 批量操作

  批量操作

其他数据库函数


基础查询

基本单表Select查询

LINQ本身支持四种不同的集合生成方式,包含生成数组的ToArray()、生成列表的ToList、生成字典集合的ToDictionary

        //基本查询
        public async Task GetSelet()
        {
            //select * from BasBloodVariety
            var varietyList = _varietyRepository.GetAll();
            //select Top 1 * from BasBloodVariety
            var varietyMessage = await _varietyRepository.GetAll().FirstOrDefaultAsync();
            //select * from BasBloodVariety where Id=1
            var varietyWhere = await _varietyRepository.GetAll().Where(t => t.Id==1).ToListAsync();

            //select * from BasBloodVariety where Id=1 and BasXyzl=1
            var varietyWhereAnd = await  _varietyRepository.GetAll().Where(t => t.Id==1 && t.BasXyzl==1).ToListAsync();
            //select * from BasBloodVariety where Id=1 || BasXyzl=1
            var varietyWhereOr = await _varietyRepository.GetAll().Where(t => t.Id==1 || t.BasXyzl==1).ToListAsync();
       
        }

 基本单表Select查询wherIf

        //基本查询
        public async Task GetSeletWhereIf(int? Id)
        {
            /*
             * WhereIf就是封装了一层if判断的 Where方法
            public static IQueryable<T> WhereIf<T>(this IQueryable<T> query, bool condition, Expression<Func<T, bool>> predicate)
           {
               if (!condition)
               {
                   return query;
               }

               return query.Where(predicate);
           }
           */

            var varietyWhere = await _varietyRepository.GetAll().WhereIf(Id!=null, t => t.Id==Id).ToListAsync();
        }

基本单表SelectMany查询

会按照list1 内的元素个数调用它的selector,并组装集合输出。例如,list1有2个,list2 的元素就会重复出现2次

        public async Task<List<int>> SelectMany() {
            List<int> list1 = new List<int>() { 1, 2 };
            List<int> list2 = new List<int>() {9 };

            var query = list1.SelectMany(o => list2).ToList();
            _varietyRepository.GetAll().SelectMany(o => _productRepository.GetAll()).ToList();
            return query;

        }

 对应数据库的CROSS JOIN 方法

数据排序

        //数据排序:OrderBy() 与ThenBy() 优先级 OrderBy>ThenBy 倒序OrderByDescending>ThenByDescending
        //基本查询
        public async Task GetOrderBy(int? Id)
        {
           
            var varietyWhere = await _varietyRepository.GetAll().OrderBy(t=>t.Id).ThenBy(t=>t.BasXyzl).ToListAsync();

        }

分页Skip()、 Take()

        public async Task<List<BasBloodVariety>> GetSkipToList()
        {
            var varietySkipList = await _varietyRepository.GetAll().Skip(0).Take(13).ToListAsync();
            return varietySkipList;
        }

查询聚合操作符(如 Count、Sum、 Min、Max、Average、Aggregate) 不返回一个序列,而返回一个值。

        //聚合操作符
        public async Task GetSeletFun(int? Id)
        {

            var varietyCount = await _varietyRepository.GetAll().CountAsync();
            var varietySum = await _varietyRepository.GetAll().SumAsync(t=>t.Id);
            var varietyAver = await _varietyRepository.GetAll().AverageAsync(t => t.Id);
        }

 

基本单表分页

  var varietyWhereOrPage =await _varietyRepository.GetAll().Where(t => t.Id==1 || t.BasXyzl==1).Skip(0).Take(13).ToListAsync();

 基本单表 in / not in

        //not in  / in
        public async Task<List<BasBloodVariety>> GetSeletNotIn()
        {
            //千万不要tolist!!!不然拼不成一整句sql
            var productList = _productRepository.GetAll().Where(s => s.Code!="1");
            var varietyList =await _varietyRepository.GetAll().Where(t=>(productList.Select(tb => tb.BasBloodVarietyId).Contains(t.Id))).ToListAsync();
            return varietyList;
        }

 基本单表 in / not in错误写法
//千万不要tolist!!!不然拼不成一整句sql 例如这句就分成2个sql查询;1 

       //not in 错误写法
        public async Task<List<BasBloodVariety>> GetSeletNotInToList()
        {
            //千万不要tolist!!!不然拼不成一整句sql 例如这句就分成2个sql查询;1
            var productList = _productRepository.GetAll().Where(s => s.Code!="1").ToList();
            var varietyList = await _varietyRepository.GetAll().Where(t => (productList.Select(tb => tb.BasBloodVarietyId).Contains(t.Id))).ToListAsync();
            return varietyList;
        }

内连接Join

        //内连
        public async Task<List<LeftJoinDto>> GetInnerJoin()
        {
            /*
             select * from  BasBloodProduct JOIN BasBloodVariety on  BasBloodProduct.BasBloodVarietyId = BasBloodVariety.Id
             */
            // 内连接示例
            /*
            var innerJoinQuery =
                from c in _varietyRepository.GetAll()
                join o in _productRepository.GetAll() on c.Id equals o.BasBloodVarietyId
                select new LeftJoinDto { varietyId = c.Id, productName = c.Name };
            */
            var innerJoinQuery = await _varietyRepository.GetAll()
                .Join(_productRepository.GetAll(), c => c.Id, o => o.BasBloodVarietyId, (c, o) => new LeftJoinDto { varietyId = c.Id, productName = c.Name }).Skip(0).Take(13).ToListAsync();
            return innerJoinQuery;
        }

左连  GroupJoin

方法查询

        //左连
        public async Task<List<LeftJoinDto>> GetLeftJoin()
        {
            /*
             select * from  BasBloodProduct LEFT JOIN BasBloodVariety  on  BasBloodProduct.BasBloodVarietyId = BasBloodVariety.Id
             */
            // 左连接示例 以左表为主
            /*
  */

            var leftJoinQuery = await _varietyRepository.GetAll().GroupJoin(_productRepository.GetAll(), c => c.Id, o => o.BasBloodVarietyId,
                (l, tmp) => new LeftJoinDto { varietyId = l.Id, productName = tmp.DefaultIfEmpty().FirstOrDefault()==null ? "" : tmp.DefaultIfEmpty().FirstOrDefault().Name })

                .ToListAsync();

            return leftJoinQuery;

        }

语法查询  多了into coGroup    from o in coGroup.DefaultIfEmpty()

           var leftJoinQuery =
                from c in _varietyRepository.GetAll()
                join o in _productRepository.GetAll() on c.Id equals o.BasBloodVarietyId into coGroup
                from o in coGroup.DefaultIfEmpty()
                select new LeftJoinDto { varietyId = c.Id,productName= 0.Name };

分组查询Group By 

分组容易出性能问题,写分组后一定再三检查生成的语句

对应Group By来说还有一个 ToLookup,效果是一样的,但是会让数据分组在系统内存进行就不演示了

        //分组
        public async Task<List<string>> GetGroupByJoin()
        {
            var product = await _productRepository.GetAll().GroupBy(tt => tt.Code).Select(ta => ta.Key).ToListAsync();
            return product;
        }

注意分组查询只能出现 Count 和 Sum 聚合函数 和 key,其他函数会做全表查询

内连+分组查询Group By 

        public List<LeftJoinDto> GetGroupByJoinOne()
        {
            // var product =await _productRepository.GetAll().GroupBy(tt => tt.Code).Select(ta => ta.Key).ToListAsync();


            /*
             并且使用 Count 和 Sum 聚合函数来计算每个城市的客户数量和订单总数。当我们执行以上 LINQ 查询时,ORM 会生成包含 Group By 的 SQL 语句。
             */

            var innerJoinQuery = from variety in _varietyRepository.GetAll()
                                 join product in _productRepository.GetAll() on variety.Id equals product.BasBloodVarietyId
                                 group product by product.Code into product2
                                 select new LeftJoinDto
                                 {
                                     varietyId = product2.Min(a => a.BasBloodVarietyId),
                                     productName = product2.Key,
                                 };

            return innerJoinQuery.ToList();


        }

---------------------实际业务中--------没那么简单,下列举个比较复杂的例子  

  linqA表左连B表,再B表内连C表 

        public async Task<List<LeftJoinDto>> Get3LeftJoin()
        {
            /*
             sql实现表A表B内连表C左连
             */
            //问题写法 分开写,但第一个查询对象不明确
            //var innerJoin = from a in _bloodRepository.GetAll()
            //                join b in _productRepository.GetAll() on a.BasBloodProductId equals b.Code
            //                select new { A = a, B = b };

            //var leftJoin = from ab in innerJoin
            //               join c in _varietyRepository.GetAll() on ab.B.BasBloodVarietyId equals c.Id into tmp
            //               select new LeftJoinDto {  varietyId = ab.B.BasBloodVarietyId};

            var result = await (from a in _bloodRepository.GetAll()
                                join b in _productRepository.GetAll() on a.BasBloodProductId equals b.Code into leftJoinGroup
                                from c in leftJoinGroup.DefaultIfEmpty()
                                join d in _varietyRepository.GetAll() on c.BasBloodVarietyId equals d.Id
                                select new LeftJoinDto { varietyId = d.Id, productName=c.Name }).Skip(1).Take(100).ToListAsync();

            return result;
        }

待解决问题, 左连+分组 无法生成 Group By sql语句,全表提交了

为什么要纠结这个问题,因为随着业务的复杂,很多人喜欢 分组后再where,因为 无法生成 Group By sql语句  Group By是在内存做的,就容易造成数据量过大,出现性能问题

        /*
 linq实现A表左连B表,过滤掉B表再A表不存在的,B表存在多条时只保留一条。返回A表与B表信息 = 逻辑不成立 直接内连分组就好了
 linq实现A表左连B表,B表存在多条时只保留一条 (没解决 左连的时候,怎么同时做分组)
 */
        public async Task<List<LeftJoinDto>> GetLeftGroupByJoinOne()
        {
            /*
             select BasBloodVariety.Id,Min(BasBloodProduct.Name) as Name from  BasBloodVariety  
left JOIN BasBloodProduct on  BasBloodProduct.BasBloodVarietyId = BasBloodVariety.Id
GROUP BY BasBloodVariety.Id,BasBloodProduct.Code
HAVING BasBloodProduct.Code Is NOT NULL
             */
            // 左连接示例 以左表为主  

            var result = from variety in _varietyRepository.GetAll()
                         join product in _productRepository.GetAll() on variety.Id equals product.BasBloodVarietyId into productGroup
                         from productb in productGroup.DefaultIfEmpty()
                         group productb by new { variety.Id, productb.Code } into g
                         select new LeftJoinDto { varietyId = g.Key.Id, productName=g.Key.Code };

            var innerJoinQuery2 = result.Where(t => t.varietyId>10);

            return innerJoinQuery2.ToList();


        }

        public async Task<BasBloodIndicationReturnDto> InsertData(BasBloodIndicationEditDto input)
        {
            var entity = input.MapTo<BasBloodIndication>();
// await _entityRepository.InsertAsync(entity); 不返回id版本
            input.Id = await _entityRepository.InsertAndGetIdAsync(entity);
          return input.MapTo<BasBloodIndicationReturnDto>(); ;
        }

 批量操作

建议用 EFCore.BulkExtensions,原因免费。但是用ABP框架的要注意,批量操作是不包含框架的赋值的,用户id,修改时间,修改人,创建时间,创建人是不会的自动赋值

 _entityCheckRuleDetailRepository.GetDbContext().BulkInsertAsync(entityL);

 

      public async Task<BasBloodIndicationReturnDto> UpdateData(BasBloodIndicationEditDto input)
        {
            var entity = await _entityRepository.UpdateAsync(input.MapTo<BasBloodIndication>());
            return entity.MapTo<BasBloodIndicationReturnDto>();
        }

  批量操作

        public async Task<List<BasBloodIndicationReturnDto>> BacthUpdateData(List<BasBloodIndicationEditDto> input)
        {
            var updateList = _entityRepository.GetAll().Where(t => input.Select(a => a.Id).Contains(t.Id));
            //批量修改要判断数量,否则容易数量为0是报错
           if (updateList.Count()>0) {
                await updateList.BatchUpdateAsync(a => new BasBloodIndication { BasXyzl=1 });
            }
          
            return input.MapTo<List<BasBloodIndicationReturnDto>>();
        }

原生的就是批量的,所以不建议使用  EFCore.BulkExtensions的删除方法

        public async Task BacthDelete()
        {

            await _entityRepository.DeleteAsync(t => t.BasXyzl==1&&t.Id==0);
           
        }

其他数据库函数

.net 5以上版本 

      //其他数据库函数
        //public async Task GetSeletCast()
        //{
        //    var result = from b in_varietyRepository.GetAll()
        //                 where SqlFunctions.StringConvert((double)b.Id) == "1"
        //                 select b;
        //}

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

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

相关文章

基于springboot框架Java+vue2开发的智慧校园源码,智慧班牌源码

智慧校园云平台电子班牌系统源码 智慧校园平台电子班牌系统源码在大数据平台下&#xff0c;对应用系统进行统一&#xff0c;以数据互联软硬结合的特点应用在校园&#xff0c;实现对校园、班级、教师、学生的管理。 文末获取联系&#xff01; 电子班牌硬件主要用于显示班级信息…

Java SE

文章目录 基本概念cmd命令Java构成原码/反码/补码基本数据类型*switch表达式运算符三大特性关键字*对象四种关系对象的引用内存分配*接口*抽象类*内部类方法重载方法重写可变参数代码块包装类字符串* 基础知识常用APIMathSystemRuntimeObjectObjectsArraysBigIntegerBigDecimal…

node之包(第三方模块)

目录 安装包的命令 卸载包的命令 devDependencies节点 解决下包速度慢的问题 导入moment包案例 包的分类 项目包 全局包 模块的加载机制 优先从缓存中加载 内置模块的加载机制 自定义模块的加载机制 第三方模块的加载机制 目录作为模块 包是由第三方个人或团队…

c/c++:char*定义常量字符串,strcmp()函数,strcpy()函数,寻找指定字符,字符串去空格

c/c&#xff1a;char*定义常量字符串&#xff0c;strcmp()函数&#xff0c;strcpy()函数&#xff0c;寻找指定字符&#xff0c;字符串去空格 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; 我所…

《基于深度迁移学习的可穿戴睡眠阶段分类》阅读笔记

一、摘要 佩戴可穿戴设备进行睡眠监测是一种无创、便捷的方法&#xff0c;可以提高睡眠障碍筛查和健康监测的效率。然而&#xff0c;由于缺乏大规模、标准化的PPG数据集&#xff0c;使用PPG进行睡眠阶段分类仍然具有挑战性。本文提出了一种基于深度迁移学习的方法来解决这个问…

类对象的大小---this指针

如何计算类对象的大小 问题&#xff1a;类中既可以有成员变量&#xff0c;又可以有成员函数&#xff0c;那么一个类的对象中包含了什么&#xff1f;如何计算一个类的大小&#xff1f; 类对象的存储方式 只保存成员变量&#xff0c;成员函数存放在公共的代码段 结论&#xf…

不得不说的结构型模式-装饰器模式

目录 装饰器模式是什么 下面是装饰器模式的一个通用的类图&#xff1a; 以下是使用C实现装饰器模式的示例代码&#xff1a; 下面是面试中关于桥接器模式的常见的问题&#xff1a; 下面是问题的答案&#xff1a; 装饰器模式是什么 装饰器模式是一种结构型设计模式&#xff…

数据分析中常见标准的参考文献

做数据分析过程中&#xff0c;有些分析法方法的标准随便一搜就能找到&#xff0c;不管是口口相传还是默认&#xff0c;大家都按那样的标准做了。日常分析不细究出处还可以&#xff0c;但是正式的学术论文你需要为你写下的每一句话负责&#xff0c;每一个判断标准都应该有参考文…

一步一步教你部署hexo博客网站

先看效果&#xff1a; 目录 一、官网 二、安装Git和Node(最好是最新版本) 三、找个放项目的地方&#xff1a;新建一个文件夹 hexo并在该目录下执行命令 四、用WebStorm打开hexo文件夹 五、启动项目 六、打包&#xff08;如果重复打包&#xff0c;每次打包之前&#xff0c…

学电路设计时,你遇到过什么有趣的事?

说几个学生时代的傻x事&#xff1a; 1、以前对DC-DC懂得少&#xff0c;而且一般开关电源芯片小&#xff0c;还有一堆外围&#xff0c;手焊很麻烦&#xff0c;就觉得三端稳压器碉堡了啊&#xff0c;一个就能得到想要的电压啊&#xff0c;有木有。然后就各种用三端稳压器。那玩意…

音频处理库大PK:四种主流库在计算mel频谱时性能如何?

目录 介绍测试脚本注意警告 性能Linux - AMDLinux - IntelmacOS - IntelmacOS - M1 总结 介绍 音频信号处理在各种应用中都发挥着重要的作用&#xff0c;如语音识别、音乐信息检索、语音合成等。其中&#xff0c;Mel频谱是一种常用的频域特征表示方法&#xff0c;用于描述人类…

【Hello Network】网络编程套接字(四)

作者&#xff1a;小萌新 专栏&#xff1a;网络 作者简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客简介&#xff1a;简单介绍下TCP通讯过程 文章目录 简单的TCP英译汉服务器更改handler方法 地址转换函数字符串转化整型IP整数IP转化字符串 绑定失败问题TCP协议通讯流…

贪吃蛇小游戏(C++)

首先我们需要下载EasyX&#xff08;具体的方法在EasyX专栏中有提到&#xff09; easyX下载和绘制简单基本图形_小梁今天敲代码了吗的博客-CSDN博客 贪吃蛇这个游戏我们一定都玩过&#xff0c;玩家使用方向键操控一条“蛇”&#xff0c;蛇会朝着一个方向不断移动&#xff0c;玩…

主成分分析

一、案例与数据 某研究者对企业员工进行调查&#xff0c;并且制定了一份问卷&#xff0c;研究者想要将问卷中的多个量表题进行浓缩以便后续分析&#xff0c;比如休假制度、资金制度、工资水平或者晋升制度等等&#xff0c;其中部分数据如下&#xff1a; 二、分析问题 其实想要…

时序预测 | MATLAB实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆网络时间序列预测

时序预测 | MATLAB实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆网络时间序列预测 目录 时序预测 | MATLAB实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆网络时间…

前端已死还是“娱乐至死”?做个清醒的前端

目录 一、前言 二、为什么会出现“前端已死”的观点&#xff1f; 1、技术变化太快&#xff1a; 2、前端工程化带来的挑战&#xff1a; 3、新技术的崛起&#xff1a; 三、前端该如何提升自己 1、学习新技术&#xff1a; 2、掌握前端工程化&#xff1a; 3、参与社区和开…

远程网关桥接模式实现同一局域网组网管理(Superlink)

远程网关桥接模式配置介绍及示例 功能简述 智联物联远程网关桥接模式&#xff0c;是指电脑侧Superlink远程工具及前端ZP网关通过4G/WAN/WiFi客户端等方式分别接入互联网及后端服务器平台远程服务后&#xff0c;再借助虚拟网卡桥接技术&#xff0c;先由服务器平台下发桥接网络参…

室内定位之5G定位

一、前言 随着5G通信基础设施逐步完善&#xff0c;5G网络的优势一方面在于其具有的更大的带宽和子载波间隔&#xff0c;使得5G室内定位精度提升(3.5GHz频段下定位精度在5米左右&#xff0c;毫米波定位精度可以达到3米或更高)&#xff0c;相对于其他定位技术&#xff0c;已建成…

解决docker启动mysql无法输入中文以及中文不显示或乱码问题

前言 我在使用MySQL时&#xff0c;遇到了两个问题。一是在插入中文数据时&#xff0c;无法输入中文。二是在select的时候&#xff0c;查出来的中文数据是空的&#xff08;因为插入时为空&#xff09;&#xff0c;然后我就使用Navicat连接数据库添加了中文数据&#xff0c;再到…

【MySQL】联合查询子查询以及合并查询的使用

目录 上篇在这里喔~ GROUP BY分组子句与联合查询的使用详解 联合查询步骤 1.自连接 1.查询每位同学的计算机原理和Java的成绩 2.显示所有计算机原理成绩比java成绩高的成绩信息 2.子查询 1.单行子查询 1.查询’许仙‘的同班同学 2.多行子查询 1.查询语文或英语课程的…