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/