一、为什么要在EF中执行SQL语句
使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢。如果要写SQL语句,完全可以使用ADO.NET来操作数据库。这样说虽然没错,可是有些时候使用EF操作数据库还是有一些不方便的地方,例如:如果要修改某一条记录,按照EF的正常流程走,需要先把要修改的数据查询出来,然后在去修改,这样不仅麻烦而且性能也低,这时直接使用EF执行SQL语句性能会提高很多。ring 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; }}// 方法四:SqlQuerytry{ 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();
到此这篇关于Entity Framework中执行sql语句的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。








