EfCore 執行原生SQL

十年河東,十年河西,莫欺少年窮

學無止境,精益求精

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);

@諸葛臥龍 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章