• 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

  • 相关阅读:
    C#使用HttpWebRequest和HttpWebResponse上传文件示例
    c#深拷贝和浅拷贝的区别
    C#redis缓存应用
    如何设计一个高并发系统?
    第2章 关系数据库(重点) | 数据库知识点整理
    第1章 绪论 | 数据库知识点整理
    基于套接字的班级聊天群设计
    两数交换的三种方法(C/C++)
    关于知识图谱的思考
    如何找出唯一成对的数(C/C++)
  • 原文地址:https://www.cnblogs.com/weiweictgu/p/6443759.html
Copyright © 2020-2023  润新知