猿教程 Logo

Entity Framework 执行原生SQL

您可以使用DBContext对数据库执行原始SQL查询。 您可以执行以下类型的查询:

  1. 返回特定类型实体的实体类型的SQL查询

  2. 返回基本数据类型的非实体类型的SQL查询

  3. 执行原始SQL命令到数据库


实体类型的SQL查询:

正如我们在前面的章节中看到的一样,DBSet有SQLQuery()方法来编写返回实体实例的原始SQL查询。 返回的对象将被上下文跟踪,就像它们是由LINQ查询返回的一样。 例如:

using (var ctx = new SchoolDBEntities())
{
    var studentList = ctx.Students.SqlQuery("Select * from Student").ToList<Student>();
  
}

但是,SQL查询返回的列应该匹配实体类型为DBSet的属性,否则会抛出异常。 例如:

using (var ctx = new  SchoolDBEntities())
{                
    var studentName = ctx.Students.SqlQuery("Select studentid, studentname 
        from Student where studentname='New Student1'").ToList();
}

如果更改query中的列名称,那么它将抛出异常,因为它必须匹配列名称:

using (var ctx = new SchoolDBEntities())
{                
    //this will throw an exception
    var studentName = ctx.Students.SqlQuery("Select studentid as id, studentname as name 
            from Student where studentname='New Student1'").ToList();
}

非实体类型的SQL查询:

可以使用Database类上的SqlQuery方法创建返回任何类型的实例(包括基本类型)的SQL查询。 例如:

using (var ctx = new SchoolDBEntities())
{
    //Get student name of string type
    string studentName = ctx.Database.SqlQuery<string>("Select studentname 
        from Student where studentid=1").FirstOrDefault();
}

将SQL命令发送到数据库:

ExecuteSqlCommnad方法在将非查询命令发送到数据库(例如插入,更新或删除命令)时非常有用。 例如:

using (var ctx = new SchoolDBEntities())
{

    //Update command
    int noOfRowUpdated = ctx.Database.ExecuteSqlCommand("Update student 
            set studentname ='changed student by command' where studentid=1");
    //Insert command
    int noOfRowInserted = ctx.Database.ExecuteSqlCommand("insert into student(studentname) 
            values('New Student')");
    //Delete command
    int noOfRowDeleted = ctx.Database.ExecuteSqlCommand("delete from student 
            where studentid=1");

}


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/entity/raw-sql-query-in-entity-framework.html