SQL脚本IN在EF中的应用

C#查询条件中存在in,为了避免拼脚本,参数化查询数据库,提高安全性,规避脚本注入。网上找了好多,最后发现 SqlParameter 是无法实现in的操作,所以只能变相来实现,结果还是不错的,性能上各位自己去测试一下吧,因为in操作本身就比较慢(无法使用索引)。下面给出SQl脚本

--传统in操作
SELECT  a.NAME
FROM    ( SELECT    ‘张源‘ AS NAME
          UNION ALL
          SELECT    ‘赵明‘ AS NAME
          UNION ALL
          SELECT    ‘王刚‘ AS NAME
          UNION ALL
          SELECT    ‘陈红‘ AS NAME
          UNION ALL
          SELECT    ‘孙强‘ AS NAME
          UNION ALL
          SELECT    ‘李伟‘ AS NAME
          UNION ALL
          SELECT    ‘钱昆‘ AS NAME
          UNION ALL
          SELECT    ‘郑芳‘ AS Name
        ) a
WHERE   name IN ( ‘张源‘, ‘郑芳‘ )
--使用CHARINDEX实现in操作
SELECT  a.NAME
FROM    ( SELECT    ‘张源‘ AS NAME
          UNION ALL
          SELECT    ‘赵明‘ AS NAME
          UNION ALL
          SELECT    ‘王刚‘ AS NAME
          UNION ALL
          SELECT    ‘陈红‘ AS NAME
          UNION ALL
          SELECT    ‘孙强‘ AS NAME
          UNION ALL
          SELECT    ‘李伟‘ AS NAME
          UNION ALL
          SELECT    ‘钱昆‘ AS NAME
          UNION ALL
          SELECT    ‘郑芳‘ AS Name
        ) a
WHERE  CHARINDEX(‘,‘+CAST(Name AS NVARCHAR(MAX))+‘,‘,‘,张源,郑芳,‘)>0

下面在给出一段EF代码:

            var ids = string.Join(",", id);
            SqlParameter[] para = new SqlParameter[] {
            //-1表示最大max
               new SqlParameter("@DetialIDs", SqlDbType.VarChar, -1) { Value=ids}
            };
            var sql = @"SELECT  DetialID
                        FROM    OrderDetial
                        WHERE   CHARINDEX(‘,‘ + cast( DetialID as varchar(max)) + ‘,‘, ‘,‘[email protected] +‘,‘)> 0";
            return Context.Database.SqlQuery<OrderDetial>(sql, para);
时间: 2024-10-11 02:07:45

SQL脚本IN在EF中的应用的相关文章

FineUI之使用SQL脚本从数据库表中生成相应的输入控件

在WEB开发时,经常需要依据数据库表中的字段建立相应的输入控件,来获取输入的数据.每次都需要按字段来敲,显然太低效,而且容易出错.这里提供一个SQL脚本生成相应输入控件的方法. USE DBDemo DECLARE @TEMP_TABLE_NAME NVARCHAR(512) DECLARE @WIDTH NVARCHAR(50) SET @TEMP_TABLE_NAME='Stuff' SET @WIDTH='200' SELECT '<f:'+TOKEN+' runat="server

通过SQL脚本来查询SQLServer 中主外键关系

在SQLServer中主外键是什么,以及主外键如何创建,在这里就不说了,不懂的可以点击这里,这篇文章也是博客园的博友写的,我觉得总结的很好: 此篇文章主要介绍通过SQL脚本来查看Sqlserver中主外键关系: SELECT f.name AS '关系名称', OBJECT_NAME(f.parent_object_id) AS '表名称', COL_NAME(fc.parent_object_id,fc.parent_column_id) AS '字段名称', OBJECT_NAME (f.r

FineUI之使用SQL脚本从数据库表中生成对应的输入控件

在WEB开发时.常常须要根据数据库表中的字段建立对应的输入控件,来获取输入的数据.每次都须要按字段来敲,显然太低效.并且easy出错.这里提供一个SQL脚本生成对应输入控件的方法. USE DBDemo DECLARE @TEMP_TABLE_NAME NVARCHAR(512) DECLARE @WIDTH NVARCHAR(50) SET @TEMP_TABLE_NAME='Stuff' SET @WIDTH='200' SELECT '<f:'+TOKEN+' runat="serv

创建包含sql命令的sql脚本文件

sql脚本是包含一到多个sql命令的sql语句,我们可以将这些sql脚本放在一个文本文件中(我们称之为“sql脚本文件”),然后通过相关的命令执行这个sql脚本文件.基本步骤如下: 1.创建包含sql命令的sql脚本文件 文件中包含一些列的sql语句,每条语句最后以;结尾,文件内容示例如下: --创建表,使用“--”进行注释 create table 表名称 (                      Guid Varchar(38) not null primary key,     Tit

Oracle导出包含clob字段的sql脚本工具

之前工作中遇到生产环境不允许导入Oracle的dmp文件,只能导入sql脚本,但是表中存在clob字段,直接用plsql工具无法导出clob字段,用了下dbvisualizer可以直接导出,亲测可用. dbvisualizer是一款十分好用的数据库工具,支持数据库AmazonRedShift.DB2LUW.Exasol.H2.Informix.JavaDB/Derby.Microsoft SQL Server.MIMERSQL.MySQL.Netezza.NuoDB.Oracle.Postgre

EF中自编写SQL脚本查询结果(适用于复杂SQL逻辑提高查询效率)

前不久项目开发过程中,使用的是Entity Framework做数据处理.因为本人也不是对EF太有研究,只是会用而已,但是在一次需要查询的结果需要关联3.4个表来查询出来结果,并且对查询效率也有要求.但是个人觉得遇到这样的情况还是使用原始SQL语句来查询更为可控(或许EF中有更好的方法可以解决此类问题,但恕本人愚笨只想到了这种方法).就又自己扩展出一个方法,用来专门查询自定义编写的SQL语句.代码如下: public List<T> ExecuteStoreQuery(string comma

.net(C#)在Access数据库中执行sql脚本

自己写的一个工具类,主要是业务场景的需要. 主要有两个功能: ①执行包含sql语句的字符串 ②执行包含sql语句的文件 调用方式 1 /// <summary> 2 /// 执行sql语句 3 /// </summary> 4 /// <param name="sql">需要执行的sql语句</param> 5 public bool ExecuteSql(string sql, ref string errorMsg) 6 { 7 Se

EF中执行sql语句

EF原理 EF 会自动把 Where().OrderBy().Select()等这些编译成"表达式树(Expression Tree)",然后会把表达式树翻译成 SQL 语句去执行.(编译原理,AST)因此不是"把数据都取到内存中,然后使用集合的方法进行数据过滤",因此性能不会低.但是如果这个操作不能被翻译成 SQL 语句,则或者报错,或者被放到内存中操作,性能就会非常低 跟踪EF的查询Sql语句: DbContext 有一个 Database 属性,其中的 Log

[转]基于SQL脚本将数据库表及字段提取为C#中的类

开发时,勉不了需要使用SQL直接与数据库交互,这时对于数据库中的表名及字段名会使用的比较多.如果每使用一次都复制一个,实在蛋疼.所以就考虑将其做成const常量.但是数据库中的表和字段相当多,一个一个敲,不但累,还有可能敲错.要保证正确,最好的办法当然是使用工具或者脚本. 这里提供一个SQL脚本的实现. 原理:获取数据库的表--->遍历每个表中的字段--->生成数据 SQL代码 DECLARE @tableName VARCHAR(MAX)DECLARE @tableCount intDECL