应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

ef ,ef core 使用原生 SQL 查询

7582人阅读 2020/3/25 23:47 总访问:5194524 评论:0 收藏:0 手机
分类: EF

有时候在执行一个赋值一点的sql要动态生成用lamdba来写很不方便,新版本用动态生成表达式树的方式也不怎么行了...

需要时间去慢慢研究,我们也可以尝试选择使用原生的sql方法。可以使用FromSqlRaw 或FromSqlInterpolated

一个简单的动态拼接or条件的例子:

  1. //动态构建sql语句        
  2. StringBuilder stringBuilder = new StringBuilder();
  3. stringBuilder.Append("select * from Article where userid=@userid and IsXX!=1 and (");
  4. List<SqlParameter> sqlParameters = new List<SqlParameter>();
  5. sqlParameters.Add(new SqlParameter("userid", userid));
  6. for (int i = 0; i < _keywords.Count; i++)
  7. {
  8.     stringBuilder.Append(" Title like @key" + i);
  9.     if (i != _keywords.Count - 1)
  10.     {
  11.         stringBuilder.Append(" or ");//不是最后一个说明还有条件需要链接一个or
  12.     }
  13.     sqlParameters.Add(new SqlParameter("key" + i, "%" + _keywords[i] + "%"));
  14. }
  15. stringBuilder.Append(" ) ");
  16. var queryable = context.Article.FromSqlRaw(stringBuilder.ToString(), sqlParameters.ToArray()).ToList();


ef core执行原生sql的查询你可能还需要加上的扩展方法:
如下:

  1. public static class EntityFrameworkCoreExtensions
  2. {
  3.     private static DbCommand CreateCommand(DatabaseFacade facade, string sql, out DbConnection connection, params object[] parameters)
  4.     {
  5.         var conn = facade.GetDbConnection();
  6.         connection = conn;
  7.         conn.Open();
  8.         var cmd = conn.CreateCommand();
  9.         if (facade.IsSqlServer())
  10.         {
  11.             cmd.CommandText = sql;
  12.             cmd.Parameters.AddRange(parameters);
  13.         }
  14.         return cmd;
  15.     }
  16.     public static DataTable SqlQuery(this DatabaseFacade facade, string sql, params object[] parameters)
  17.     {
  18.         var command = CreateCommand(facade, sql, out DbConnection conn, parameters);
  19.         var reader = command.ExecuteReader();
  20.         var dt = new DataTable();
  21.         dt.Load(reader);
  22.         reader.Close();
  23.         conn.Close();
  24.         return dt;
  25.     }
  26.     public static List<T> SqlQuery<T>(this DatabaseFacade facade, string sql, params object[] parameters) where T : classnew()
  27.     {
  28.         var dt = SqlQuery(facade, sql, parameters);
  29.         return dt.ToList<T>();
  30.     }
  31.     public static List<T> ToList<T>(this DataTable dt) where T : classnew()
  32.     {
  33.         var propertyInfos = typeof(T).GetProperties();
  34.         var list = new List<T>();
  35.         foreach (DataRow row in dt.Rows)
  36.         {
  37.             var t = new T();
  38.             foreach (PropertyInfo p in propertyInfos)
  39.             {
  40.                 if (dt.Columns.IndexOf(p.Name) != -1 && row[p.Name] != DBNull.Value)
  41.                     p.SetValue(t, row[p.Name], null);
  42.             }
  43.             list.Add(t);
  44.         }
  45.         return list;
  46.     }
  47. }




ef core执行原生sql的增加,删除修改的方法:
方法1:

  1. int count =Database.ExecuteSqlRaw(sql,params);

方法2:

  1. context.Database.ExecuteSqlInterpolated()



未完待续,先简单记录一下


linq方式的动态条件:https://www.tnblog.net/aojiancc2/article/details/270


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

雨雨雨雨辰

2020/8/7 17:12:59

[good]

2020/8/7 17:18:19 回复

vue切换菜单,vue菜单选中。跳转页面通过原生js设置选中样式。vue中使用原生js方法。js 找到当前对象的兄弟对象。js获取子节点。js获取父节点。js获取当前元素的同级节点

vue切换菜单,跳转页面通过原生js设置选中样式可以利用上面那个js获取当前元素的同级节点后先设置默认的样式,然后在设置点...

如何修改重置MD5加密后的SQL用户密码

二次开发时,要加一个忘记密码的功能,后台写了修改密码的方法,数据库执行也修改成功,但是登录一直提示密码错误。之所以...

SQL Server的几种分页方式和效率

--topnotin方式 selecttop条数*fromtablename whereIdnotin(selecttop条数*页数Idfromtablename) --ROW_NUMBER()O...

MySQL主从复制+读写分离

使用Mysql读写分离和主从复制的原因:*单台MySQL服务器的安全性,高可用性,高并发都是不满足实际的生产需要。介绍:1.MySQ...

SQL Server 中使用游标

--声明一个游标 DECLAREMyCursorCURSOR FORSELECTTOP5FBookName,FBookCodingFROMTBookInfo//定义一个叫MyCursor的游标,...

MySQL控制台插入中文数据报错1366解决

计算机配置: windows系统.数据库:MySQL5.5.如图 : 下图为表结构信息:通过 show full columns from userinfo;查询所得 na...

SQLserver order by

order by 字段名order by 第几个字段(整形)order by 排序:order by 字段名:通过字段名指定的字段排序 order by 字段数...

SQLserver保障远程连接的安全性

如果是只读的话建个视图,建个普通用户只对该视图进行读。读写的话就只能自己在加一层代理服务,由代理来进行读写,各客户...

SQLerver添加用户与授权

添加用户安全性--&gt;登录名,然后右键新建登录名就可以了然后填写好相关信息就可以了右键属性,用户映射可以选择该用户可...

MySQL 游标创建

游标:可以来存储一个结果集,可以通过遍历来访问到每一个数据需求:分表数据。 把一张表的数据根据需求分离,创建不同的表...

没有为 SQL 缓存通知启用数据库

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql -S 数据库IP -U 登录名 -P 密码 -d 数据库名称 -t 表名 -et

SQLserver约束

添加表后操作约束--删除约束 altertableaj_testdropconstraintCK__aj_test__userAge__5EBF139D --为表aj_test添加默认...

c SQL简单参数化写法

防止sql 注入的,简单参数化写法publicboolLogin(string_username,string_password) { using(SqlConnectionconn=newSqlCo...

mySQL 存储过程报错:delimiter

最近刚学sql,学到了存储过程,每当练习的时候就一直出现问题。 现在记录CREATEPROCEDUREproc_out(OUTstuidINT) begin se...