十年河東,十年河西,莫欺少年窮
學無止境,精益求精
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);
@諸葛臥龍