关于EF中直接执行sql语句的参数化问题
某天 , 在review项目中代码的时候, 发现有哥们直接通过 Database.ExecuteSqlCommand("select * from order_info where company like '%abc%' ")的方式与数据库查询, 私下问其是否知道这个方法还有一个带有params object[] parameters参数重载, 对方爽快的回答:"知道啊 ,只是每次都要写一大堆的SqlParameter[] 定义, 实在是太过麻烦了,特别是有的时候查询参数太多了...." .细想一下, 确实麻烦得很,感觉又回到了直接写sqlhelper的时代了.不过转念一想, 这个方法很容易改进, 于是便有了这篇随笔,希望能给有需要的朋友一些提示.
1.目标,我们希望调用者能像字符串格式化,类似 string.Formart("select * from order_info where company like {0}","abc") 一样去方便使用,而不再关心是否是否需要参数化,但同时数据库在执行的时候,自动转化为参数化的语句.
2.略加思考:首先我们利用 string.Formart 自动将sqlCommand 格式化为带参数的一个字符串, 类似 "select * from order_info where company like @p0", 同时自动创建查询参数@p0= abc,即可.
3.于是,便有了如下方法片段
private Tuple<string, SqlParameter[]> ProcessSqlCommand(string sqlCommand, params object[] param)
{
var tempParamKeyValDic = param.Select((item, i) => new KeyValuePair<string, object>("@p" + i, item))
.ToDictionary(k => k.Key, v => v.Value); var tempSqlCommand = string.Format(sqlCommand, tempParamKeyValDic.Keys.ToArray());
var tempParams = tempParamKeyValDic.Select(t => new SqlParameter(t.Key, t.Value)).ToArray(); return Tuple.Create(tempSqlCommand, tempParams);
}
4. 同时对外提供两个类似的ExecSqlCommand 和 SqlQuery 方法即可.
public int ExecSqlCommand(string sqlCommand, params object[] param)
{
if (param == null || param.Length == )
{
return Context.Database.ExecuteSqlCommand(sqlCommand);
} var temp = ProcessSqlCommand(sqlCommand, param); return Context.Database.ExecuteSqlCommand(temp.Item1, temp.Item2);
} public List<T> SqlQuery<T>(string sqlCommand, params object[] param)
{
if (param == null || param.Length == )
{
return Context.Database.SqlQuery<T>(sqlCommand).ToList();
} var temp = ProcessSqlCommand(sqlCommand, param); return Context.Database.SqlQuery<T>(temp.Item1, temp.Item2).ToList();
}
5. 客户端在调用的时候,直接使用类似如下模式
var data=repository.SqlQuery<OrderInfo>(“select * from order_info where company like {0}","abc”);
后记:
1. 事关数据安全无小事, 任何侥幸心理都应该避免;
2. 当有人在埋怨程序不好写, 或者框架不好用的时候 , 需要换位思考,并极力改进;
3. 大家在谈论项目框架或系统架构的时候,并不是时时刻刻都需要关注类似高大上的高并发架构图, 有的时候还得压住浮躁的心态关注眼前的蹩脚之处.
关于EF中直接执行sql语句的参数化问题的更多相关文章
- SQL*PLUS中批量执行SQL语句
SQL*PLUS中批量执行SQL语句 今天由于工作的需要,要在CMD中批量执行大量的SQL语句,对于Oracle学习还处在入门阶段的我,只能硬着头皮到处去寻找资料(主要是网络资料,也包括自己的电子书) ...
- Eclipse中直接执行sql语句(图文说明)
转自:https://blog.csdn.net/changjyzzu/article/details/45487847 1.首先新建sql文件,然后打开文件 22.右键点击空白处,点击set-con ...
- Django中直接执行SQL语句
欢迎加入python学习交流群 667279387 今天在django views.py看到同事写的代码里面有段关于数据库查询的语句.因为涉及多个表的查询,所以django 的models的查询无法满 ...
- SQLSERVER 在PROCEDURE 中动态执行SQL语句【EXEC】并获取
1.直接上代码 CREATE PROCEDURE [dbo].[TEST] AS BEGIN DECLARE )='N8-4F', --構建SQL需要的條件 ),--構建後的SQL語句 @cnt in ...
- linq直接执行sql语句
1.ExecuteQuery方法 看命名,我们很容易联想到ado.net里熟悉的Command的ExecuteNonQuery方法,但是VS的智能提示告诉我们这个方法返回的是一个泛型集合,应该&quo ...
- PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别
PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别 在PL/SQL中在执行SQL语句时可以直接写SQL或者可以把一个SQL语句拼成一个字符串,如下: select * fr ...
- EF中执行sql语句,以及事务
EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...
- 在EF中执行SQL语句
你可能要问,我用EF不就为了避免写SQL吗?如果要写SQL我不如直接用ADO.NET得了.话虽然这么说没错,可有些时候使用EF操作数据还是有一些不方便,例如让你根据条件删除一组记录,如果按照正常的流程 ...
- EF Core中执行Sql语句查询操作之FromSql,ExecuteSqlCommand,SqlQuery
一.目前EF Core的版本为V2.1 相比较EF Core v1.0 目前已经增加了不少功能. EF Core除了常用的增删改模型操作,Sql语句在不少项目中是不能避免的. 在EF Core中上下文 ...
随机推荐
- PHP对象相关知识点的总结
对象传递:一种说法是"PHP对象是通过引用传递的",更准确的说法是别名(标识符)传递,即它们都保存着同一个标识符(ID)的拷贝,这个标识符指向同一个对象的真正内容. <?ph ...
- 【G】开源的分布式部署解决方案文档 - 部署Console & 控制负载均衡 & 跳转持续集成控制台
G.系列导航 [G]开源的分布式部署解决方案 - 导航 设置项目部署流程 项目类型:选择Console,这个跟功能无关,只是做项目分类,后面会有后续功能 宿主:选择Console 部署方式:选择原始, ...
- C#中的泛型和泛型集合
泛型 泛型引入了一个概念:类型参数.通过使用类型参数(T)减少了运行时强制转换或装箱操作的风险,通过泛型可以最大限度的重用代码,保护类型的安全及提高性能,他的最常见应用就是创建集合类,可以约束集合类中 ...
- 什么是javascript中的静态方法?一个例子让你懂~!
function Foo(){ this.age = 28};var a = new Foo();alert(a.age);//28alert(a.name);//undifined Foo.name ...
- Java Excel 合并单元格
//合并单元格CellRangeAddress cra = new CellRangeAddress(0, 0, 0, 4);sheet.addMergedRegion(cra);
- CSS元素垂直居中方法总结
坚持,坚持,坚持... 以上为自我鼓励,哈哈... ------------------------------------------------- 相信没有真正是尝试过的人应该都和我一样,觉得居中 ...
- spring-mvc @Controller 200-不生效
复杂的故事简单说,复杂的问题简单做.问题记录. 现象 新增加一个Controller,但在js中调用时报请求200,无请求反馈,重启服务多次,问题依旧. controller 分析 从问题现象分析:2 ...
- Unix系统操作指令汇总
一.目录及文件操作命令 1.1 ls 语法: ls [-RadCxmlnogrtucpFbqisf1] [目录或文件--] 说明: ls 命令列出指定目录下的文件,缺省目录为当前目录 ./,缺省输出顺 ...
- bzoj4784 [Zjoi2017]仙人掌
Description 如果一个无自环无重边无向连通图的任意一条边最多属于一个简单环,我们就称之为仙人掌.所谓简单环即不经过重复的结点的环. 现在九条可怜手上有一张无自环无重边的无向连通图,但是她觉得 ...
- PHP 学习笔记(3)
<?phpif (isset($_POST['action']) && $_POST['action'] == 'submitted') { echo '<pre&g ...