EF 6 DB-First系列--Entity Framework中的查询--Native SQL(原生sql)查询

Native SQL(原生sql)查询

Entity Framework支持三种类型的查询:1) LINQ-to-Entities, 2) Entity SQL, and 3) Native SQL

Entity Framework允许您为底层关系数据库执行原始SQL查询。

下面的方法可以使用Entity Framework 6.x对数据库执行原始SQL查询:

1、DbSet.SqlQuery()
2、DbContext.Database.SqlQuery()
3、DbContext.Database.ExecuteSqlCommand()

DbSet.SqlQuery()

使用DbSet.SqlQuery()方法编写原始SQL查询,返回实体实例。结果实体将由上下文跟踪,就像它们是由LINQ查询返回的一样。

using (var ctx = new SchoolDBEntities()) //数据库上下文对象
{
    var studentList = ctx.Students.SqlQuery("Select * from Students")
                        .ToList<Student>();
}

上面的查询在数据库中执行Select * from Students SQL以获取所有学生,并将其转换为学生实体列表。SQL查询中的列名必须与实体类型的属性匹配,否则将抛出异常。

可以使用SqlParameter对象指定参数,如下所示。

using (var ctx = new SchoolDBEntities()) //数据库上下文对象
{
    var student = ctx.Students
                    .SqlQuery("Select * from Students where StudentId=@id", new SqlParameter("@id", 1))
                    .FirstOrDefault();
}

如果您在SQL查询中更改了列名,那么它将抛出异常,因为它必须匹配列名。下面的示例将抛出一个异常。

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='Steve'").ToList();
}

DbSet<TEntity>. sqlquery()只对映射到指定实体的表执行SQL查询(例如DbSet. sqlquery()只返回对应的Students表的结果,而不返回任何其他表的结果)。下面的语句将抛出异常。

using (var ctx = new SchoolDBEntities()) //数据库上下文对象
{                
    //this will throw an exception
    var studentName = ctx.Students.SqlQuery("Select * from Courses").ToList();
}

Database.SqlQuery()

Database类表示底层数据库,并提供各种处理数据库的方法。Database.SqlQuery()方法返回任意类型的值。

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();

    //or
    string studentName = ctx.Database.SqlQuery<string>("Select studentname from Student where studentid=@id", new SqlParameter("@id", 1))
                            .FirstOrDefault();
}

Database.ExecuteSqlCommand()

Database.ExecuteSqlCommnad()方法在执行数据库命令(如插入、更新和删除命令)时非常有用。

using (var ctx = new SchoolDBEntities()) //数据库上下文对象
{
    int noOfRowUpdated = ctx.Database.ExecuteSqlCommand("Update student 
            set studentname ='changed student by command' where studentid=1");

    int noOfRowInserted = ctx.Database.ExecuteSqlCommand("insert into student(studentname) 
            values('New Student')");

    int noOfRowDeleted = ctx.Database.ExecuteSqlCommand("delete from student 
            where studentid=1");
}

参考

https://www.entityframeworktutorial.net/
https://msdn.microsoft.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值