首页 > 数据库 >Net6 EfCore 执行原生SQL

Net6 EfCore 执行原生SQL

时间:2023-03-14 09:47:14浏览次数:39  
标签:Articles EfCore -- context SQL Net6 wechatDbContext id name

十年河东,十年河西,莫欺少年穷

学无止境,精益求精

1、适用于: --insert  update  delete 

1.1、内插值方式:FormattableString--该方式不存在注入攻击风险,放心用  

复制代码
            using (wechatDbContext context = new wechatDbContext())
            {
               //  --insert  update  delete 
                //内插值方式:FormattableString--该方式不存在注入攻击风险,放心用  
                int id = 1;
                string name = "陈";
                context.Database.ExecuteSqlInterpolated(@$"insert into tableName values({id},{name},'男')"); 

            }
复制代码

1.2、ExecuteSqlRaw 参数化模式

复制代码
            using (wechatDbContext context = new wechatDbContext())
            { 
                int id = 1;
                string name = "陈"; 
                // 
                var paras = new { id, name };  
                context.Database.ExecuteSqlRaw("insert into tableName values(@id,@name)", paras);
                //
            }
复制代码

两种方式 建议使用内插值方式

2、适用于Select 

2.1、和DataBase实体相关的查询语句【只能单表查询】 

-- --返回 IqueryAble<T>  不会立即执行  需要toList() 等 才会执行  sql语句中不能加orderBy

复制代码
            using (wechatDbContext context = new wechatDbContext())
            { 
                int id = 1;
                string name = "陈";  
                //和DataBase实体相关的查询语句【只能单表查询】  --返回 IqueryAble<T>  不会立即执行  需要toList() 等 才会执行  sql语句中不能加orderBy
                IQueryable<Article> articles = context.Articles.FromSqlInterpolated($"select * from T_Articles where id={id}");
                string likeName = "%中%";
                IQueryable<Article> articles2 = context.Articles.FromSqlInterpolated($"select * from T_Articles where title like {likeName}");
                articles2.Where(A => A.id == 1);
                articles2.OrderBy(A => A.id).ThenBy(A => A.title);
                var lst = articles2.ToList();
                foreach(var item in lst)
                {

                }
      }
复制代码

 

2.2、Ado.NEt方式【一夜回到解放前】

--支持自定义SQL,多表Join查询,但该方式使用的是ADO.NET的方式,建议使用第三方,例如Dapper、SqlSugar等

复制代码
using (wechatDbContext context = new wechatDbContext())
            { 
                int id = 1;
                string name = "陈";   
                //
                //任意原生SQL语句【一夜回到解放前,Ado.NEt方式】  结合SqlSugar  

                DbConnection conn = context.Database.GetDbConnection();
                if (conn.State != System.Data.ConnectionState.Open)
                {
                    conn.Open();
                }
                using (var cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "select title,count(1) as titleCount from T_Articles group by title";
                    using (var reader= await cmd.ExecuteReaderAsync())
                    {
                        string title = reader.GetString(0);
                        int titleCount = reader.GetInt32(1);
                        Console.WriteLine($"{title}:{titleCount}");
                    }
                }
                // 全局过滤

                context.Articles.IgnoreQueryFilters().Where(A => A.Isdeleted == true);

            }
复制代码

3、临时笔记:全局过滤【用于软删除】

复制代码
    public class ArticleConfig : IEntityTypeConfiguration<Article>
    {
        public void Configure(EntityTypeBuilder<Article> builder)
        {
            builder.ToTable("T_Articles");
            builder.HasQueryFilter(A => A.Isdeleted == false);
            builder.HasIndex(A => A.pubdate);
        }
    }
复制代码

按照上述全局过滤后,所有的EFCORE LINQ表达式都会加上 isdeleted==false 

排除全局过滤【例如查询回收站数据】

context.Articles.IgnoreQueryFilters().Where(A => A.Isdeleted == true);

@诸葛卧龙 

 

转 https://www.cnblogs.com/chenwolong/p/16730798.html

标签:Articles,EfCore,--,context,SQL,Net6,wechatDbContext,id,name
From: https://www.cnblogs.com/wl-blog/p/17213770.html

相关文章

  • mysql
    腾讯云备案控制台开发者社区学习实践活动专区工具TVP文章/答案/技术大牛搜索写文章提问登录/注册 专栏首页技术知识分享Linux/UNIX上yum......
  • 【MySQL】substring_index 函数详解
    【MySQL】substring_index函数详解命令格式stringsubstring_index(string<str>,string<separator>,int<count>)命令说明截取字符串str第count个分隔符之前的字......
  • sql语句查询重复的数据
    博客原链接:sql语句查询重复的数据-代码改变世界&1024-博客园(cnblogs.com)记录备份,防止以后找不到 查找所有重复标题的记录:SELECT*FROMt_infoaWHERE((SELECT......
  • 使用Java替换字符串占位符的几种方法 String url2 = "jdbc:mysql://{0}:{1}/{2}"
    使用Java替换字符串占位符的几种方法https://blog.csdn.net/m0_67402125/article/details/125383655importorg.apache.commons.lang.text.StrSubstitutor;importj......
  • 一天吃透MySQL锁面试八股文
    本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校......
  • 巧妙使用SQL Server的计算列实现项目唯一规则快速定制
    转载自作者zhang502219048的微信公众号【SQL数据库编程】:巧妙使用SQLServer的计算列实现项目唯一规则快速定制软件产品,相当于是一个通用模板。而软件项目,则是基......
  • Mysql锁与事务
    我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。这些问题的本......
  • mysql排名,分组排名,行号
    基本知识:1.sql语句中,使用@来定义一个变量。如:@rank2.sql语句中,使用:=来给变量赋值,:@rank:=123,则变量rank的值为1233.sql语句中,if(A,B,C)表示,如果A条件成立,那......
  • 在linux下使用sqlite3
    前言SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的SQL数据库引擎(来源百度百科)。它是一款轻量级数据库,所占资源低,消耗总量小,被用于嵌入式开......
  • MySQL
        ......