Entity Framework执行原生SQL语句

ExecuteSqlCommand为执行命令的接口, SqlQuery 为返回查询结果

1、Database.ExecuteSqlCommand 方法 (String, Object[])

对数据库执行给定的 DDL/DML 命令。 与接受 SQL 的任何 API 一样,对任何用户输入进行参数化以便避免 SQL 注入攻击是十分重要的。 您可以在 SQL 查询字符串中包含参数占位符,然后将参数值作为附加参数提供。 您提供的任何参数值都将自动转换为 DbParameter。context.Database.ExecuteSqlCommand("UPDATE dbo.Posts SET Rating = 5 WHERE Author = @p0", userSuppliedAuthor); 或者,您还可以构造一个 DbParameter 并将它提供给 SqlQuery。 这允许您在 SQL 查询字符串中使用命名参数。 context.Database.ExecuteSqlCommand("UPDATE dbo.Posts SET Rating = 5 WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor));

2、Database.SqlQuery 方法 (Type, String, Object[])

创建一个原始 SQL 查询,该查询将返回给定类型的元素。 类型可以是包含与从查询返回的列名匹配的属性的任何类型,也可以是简单的基元类型。 该类型不必是实体类型。 即使返回对象的类型是实体类型,上下文也决不会跟踪此查询的结果。 使用 SqlQuery(String, Object[]) 方法可返回上下文跟踪的实体。 与接受 SQL 的任何 API 一样,对任何用户输入进行参数化以便避免 SQL 注入攻击是十分重要的。 您可以在 SQL 查询字符串中包含参数占位符,然后将参数值作为附加参数提供。 您提供的任何参数值都将自动转换为 DbParameter。 context.Database.SqlQuery(typeof(Post), "SELECT * FROM dbo.Posts WHERE Author = @p0", userSuppliedAuthor); 或者,您还可以构造一个 DbParameter 并将它提供给 SqlQuery。 这允许您在 SQL 查询字符串中使用命名参数。 context.Database.SqlQuery(typeof(Post), "SELECT * FROM dbo.Posts WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor));

实例:

 1  var stu = dbContext.Student.FirstOrDefault<Student>(t => t.Id == 1);
 2 
 3                 var list2 = from a in dbContext.Student
 4                             join b in dbContext.Course
 5                             on a.Id equals b.StudentId
 6                             where a.Id == 1
 7                             select new { a.Name, a.Sex, a.Aage, b.CourseName };
 8                 gridView.DataSource = list2.ToList();
 9                 gridView.DataBind();
10 
11                 var cnt = dbContext.Database.ExecuteSqlCommand("update student  set name=@name where id = @id", new SqlParameter[] {
12                 new SqlParameter("@id", 10),
13                 new SqlParameter("@name","学生姓名") });//执行更新操作
14 
15                 var res = dbContext.Database.SqlQuery<Student2>("select Id,name from student where id=@id", new SqlParameter[] {
16                     new SqlParameter("@id",10) });
17                 //返回数据
18                 //var res = dbContext.Database.SqlQuery<Student2>("select Id,name from student where id=@id", new SqlParameter("@id", 10));
19                 gridView.DataSource = res.ToList();
20                 gridView.DataBind();
ps:Student2不一定为映射的实体对象,可以为自定义其他对象,但实体对象的属性数量必须多余或等于SqlQuery查询语句中查询返回的列数量。

参考:

https://msdn.microsoft.com/zh-cn/library/system.data.entity.database.aspx

原文地址:https://www.cnblogs.com/weiweictgu/p/6443759.html