一、为什么要在EF中执行SQL语句
  使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢。如果要写SQL语句,完全可以使用ADO.NET来操作数据库。这样说虽然没错,可是有些时候使用EF操作数据库还是有一些不方便的地方,例如:如果要修改某一条记录,按照EF的正常流程走,需要先把要修改的数据查询出来,然后在去修改,这样不仅麻烦而且性能也低,这时直接使用EF执行SQL语句性能会提高很多。
    而使用EF执行SQL又比ADO.NET方便,特别是在执行查询语句的时候,EF会把查询到的数据自动保存到数据实体中,省去了使用DataReader的麻烦。同时查询出来的数据还会进行跟踪,如果你修改了查询出的值,之后就可以很方便的使用.SaveChanges()直接更新到数据库了。
在数据上下文DbContext中有一个Database的属性,Database属性中有两组方法:ExecuteSqlCommand()和SqlQuery()。这两个方法都可以用来执行SQL语句,但这两个方法也有不同点:ExecuteSqlCommand()是不返回结果的,只返回受影响的行数,所以ExecuteSqlCommand()更适合用来执行创建、插入、更新、删除操作(即执行给定的DDL/DML命令)。SqlQuery()则会返回查询到的结果,并将结果保存在数据实体中,所以SqlQuery()更适合执行查询操作。

二、使用ExecuteSqlCommand()执行创建、插入、更新、删除语句
ExecuteSqlCommand()的使用方法很简单,直接传入SQL语句就可以了,执行完成后会返回受影响的行数。
在下面的例子中,entity是一个继承自DbContext的对象。

1、执行创建语句

// 执行创建语句
string strCreateSQL = @"CREATE table test( id int primary key not null,name varchar(16),password varchar(20))";// 注意:执行create语句受影响的行数是-1
int result = entity.Database.ExecuteSqlCommand(strCreateSQL);
if (result.Equals(-1))
{Console.WriteLine("创建成功!");
}

2、执行Insert语句

// 执行Insert语句
string strInsertSQL = @"INSERT INTO testSELECT 1,'小明','1234' UNIONSELECT 2,'小王','1234' UNIONSELECT 3,'小红','1234'  ";
int result = entity.Database.ExecuteSqlCommand(strInsertSQL);
if (result > 0)
{Console.WriteLine("插入成功");
}

3、执行Update语句

// 执行Update语句
string strUpdateSQL = @"UPDATE test SET password=@pwd1 WHERE id=@id1;
UPDATE test SET password=@pwd2 WHERE id=@id2;";SqlParameter[] para =  {new  SqlParameter("@pwd1","ceshi12we"),new  SqlParameter("@id1",1),new  SqlParameter("@pwd2","ceshi127890"),new  SqlParameter("@id2",2),};int result = entity.Database.ExecuteSqlCommand(strUpdateSQL, para);
if (result > 0)
{Console.WriteLine("更新成功");
}

4、执行Delete语句

// 执行删除语句
string strDelSQL = "delete from test";
int result = entity.Database.ExecuteSqlCommand(strDelSQL);
if (result > 0)
{Console.WriteLine("删除成功");
}

5、执行Drop语句

string strDropSQL = "drop table test";
int result = entity.Database.ExecuteSqlCommand(strDropSQL);
if (result.Equals(-1))
{Console.WriteLine("删除成功");
}

注意:执行DDL语句(create、alter、drop等)返回值是-1,DML(insert、update、delete)返回的是受影响的行数。

三、使用SqlQuery()查询数据
SqlQuery()是用来执行查询的。SqlQuery()使用前需要指定返回值的类型。返回值类型可以是定义的实体类型,或者基元类型。例如:查询一个用户的完整信息,返回类型就是用户实体类型;如果是统计有多少个用户,返回值就是int类型。
注意:返回值的个数和名称必须和传入的类型中属性个数、名称相同,不如会报错。

在下面的例子中User是根据数据库表生成的实体类型。

string strSQL = "SELECT * FROM Users WHERE ID>=10 ORDER BY ID DESC";
var info = entity.Database.SqlQuery<User>(strSQL);
foreach (var item in info)
{Console.WriteLine("ID:" + item.ID + " " + "登录名:" + item.LoginName + " " + "密码:" + item.Password);
}

运行结果:

前面说过返回值的个数和名称必须和传入的类型中属性个数、名称相同,不如会报错。如果将SQL语句修改为只查询ID、登录名、密码会出现下面的错误:

如果只想查询ID、登录名、密码该怎么办呢?那就需要单独定义一个类(只包含ID、登录名、密码三个属性)来保存数据.

新定义的类,只包含ID、登录名、密码三个属性:

public class newUser
{public int ID { get; set; }public string LoginName { get; set; }public string Password { get; set; }
}

// 方法四:SqlQuery
try
{string strSQL = "SELECT ID,LoginName,Password FROM Users WHERE ID>=10 ORDER BY ID DESC";var info = entity.Database.SqlQuery<newUser>(strSQL);foreach (var item in info){Console.WriteLine("ID:" + item.ID + " " + "登录名:" + item.LoginName + " " + "密码:" + item.Password);}
}
catch (Exception ex)
{Console.WriteLine(ex.Message);
}

运行结果:

 
 

返回值是基元类型:

查询用户数量,返回int类型

// 查询用户数量
string strSQL = "SELECT COUNT(*) FROM test";
var result = entity.Database.SqlQuery<int>(strSQL);
// 注意:必须使用循环才会真正的去数据库执行SQL语句,否则不会再数据库执行SQL语句(EF的延迟加载)
foreach(var item in result)
{Console.WriteLine("用户数量:" + item.ToString());
}

运行结果:

四、使用DbSet<T>下的SqlQuery()
在每个数据实体集合DbSet<T>下也有一个SqlQuery(),功能与上面介绍的一样,只不过DbSet<T>下的SqlQuery()只能返回DbSet<T>中包含的类型,DbSet<T>下的SqlQuery()在返回数据的同时还会让数据库上下文(DBContext)跟踪返回数据的状态,如果返回的数据发生了修改,就可以使用SaveChanges()将结果直接保存回数据库。而Database.SqlQuery()查出的结果则不能跟踪返回数据的状态。

1、使用实体集合下面的SqlQuery()方法

string strSQL = "SELECT * FROM Users WHERE UserID='002068'";
User user = entity.Users.SqlQuery(strSQL).FirstOrDefault();
user.Password = "测试实体下面的SqlQuery方法";
// 调用SaveChanges()方法可以更新Password字段
entity.SaveChanges();

2、使用Database下的SqlQuery()方法

string strSQL = "SELECT * FROM Users WHERE UserID='002068'";
User user = entity.Database.SqlQuery<User>(strSQL).FirstOrDefault();
user.Password = "测试Database下面的SqlQuery方法";
// 调用SaveChanges()方法不可以更新Password字段
entity.SaveChanges();

如果希望使用Database下的SqlQuery()查询出的数据在修改后也能保存到数据库,可以使用下面的代码:

string strSQL = "SELECT * FROM Users WHERE UserID='002068'";
User user = entity.Database.SqlQuery<User>(strSQL).FirstOrDefault();
user.Password = "测试Database下面的SqlQuery方法";
// 设置这条数据的状态是:Modified,这样可以通知数据上下文,这条记录也被修改了
entity.Entry<User>(user).State = System.Data.Entity.EntityState.Modified;
// 调用SaveChanges()方法不可以更新Password字段
entity.SaveChanges();

转载自:https://www.cnblogs.com/dotnet261010/p/7249153.html

在EF中执行SQL语句相关推荐

  1. ef 执行mysql语句_在EF中执行SQL语句

    一.为什么要在EF中执行SQL语句 使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢.如果要写SQL语句,完全可以使用ADO.NET来操作数据库.这 ...

  2. [转]在EntityFramework6中执行SQL语句

    本文转自:http://www.cnblogs.com/wujingtao/p/5412329.html 在上一节中我介绍了如何使用EF6对数据库实现CRDU以及事务,我们没有写一句SQL就完成了所有 ...

  3. EF中使用SQL语句或存储过程

    EF中使用SQL语句或存储过程   1.无参数查询 var model = db.Database.SqlQuery<UserInfo>("select* from UserIn ...

  4. phpmyadmin执行mysql语句_如何在phpMyAdmin中执行sql语句

    大家使用phpMyAdmin中常遇到这样的问题:MySQL Error Message: MySQL Query Error SQL: SELECT main.*, field.* FROM ucho ...

  5. oracle: 在sqlplus中,执行sql语句

    sqlplus输入格式如下: 用户名:  Vabc_def  口令:     1@10.10.20.37/orcl 在sqlplus中,执行sql语句,比在plsql中批量执行更快.  ps: 一定要 ...

  6. pdo_fetch执行mysql_PDO中执行SQL语句的三种方法

    在PDO中,我们可以使用三种方式来执行SQL语句,分别是 exec()方法,query方法,以及预处理语句prepare()和execute()方法~大理石构件来图加工 在上一篇文章<使用PDO ...

  7. ACCESS中执行sql语句

    ACCESS中执行sql语句 简单的说:查询--新建-- 设计视图--选择表或者不选--右键新建SQL视图 不会就看图 access采用sql语句与sql的区别 Access中提供查询对象,在设计时可 ...

  8. EF Core 执行SQL语句和存储过程

    无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...

  9. Entity Framework 在MySQL中执行SQL语句,关于参数问题

    在Entity Framework中添加MySQL模型,在写代码的过程中需要直接执行SQL语句. 在SQL语句中用到了@curRank := 0 这样在SQL语句中定义参数,同时还会有传入参数:ai. ...

最新文章

  1. 在特定情况下的简单SSO实现方案
  2. 画世界上传图片提交到服务器_【MUI】选择图片并上传至服务器
  3. 广西大学计算机类开设课程,操作系统教学大纲-广西大学计算机与电子信息学院.DOC...
  4. wds+mdt 分布式自动部署 操作系统
  5. Acwing 1083. Windy数
  6. postgresql建表带注释_postgresql建表带自增id和注释语句
  7. ZZULIOJ 1063:最大公约与最小公倍
  8. AngularJS jQuery 共存法则
  9. Vue----组件库
  10. 大数据背后的无奈与焦虑:“128元连衣裙”划分矮穷挫与白富美?
  11. freenom 加 cloudflare免费域名申请
  12. 所谓计算机网络是指利用通信设备,《计算机应用基础》模拟试卷考卷二含答案...
  13. C#正则表达式测试小工具
  14. 引入mybatis-plus报 Invalid bound statement错误怎么办,动动手指改一个地方就行
  15. eclpse配置tomact
  16. 国内主要的广告联盟背景
  17. Win7系统开机提示Flash Helper Service 已停止工作解决办法!
  18. python实现和‘对象’qq自动续火
  19. 使用 canvas 实现 js 取渐变色某段色值
  20. Day114.尚医通:用户认证、阿里云OSS、就诊人管理

热门文章

  1. 回顾几个常见的XSS漏洞测试脚本
  2. mac上卸载华为投屏软件ideashare后,mac声音输入输出设备依然存在的问题
  3. 浏览器控制台打印数据
  4. 黑马Redis——黑马点评项目记录
  5. 一文读懂苹果的差分隐私技术原理
  6. mac osx下jetbrains家 IDE 开发工具 错误修复 优化
  7. VirtualBox中虚拟机通互联网
  8. python爬取app数据
  9. 日更100天(24)每天进步一点点
  10. 在 Word 中添加页码