MVC EF 执行SQL语句(转载)
MVC EF 执行SQL语句
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。
十年河东十年河西,莫欺少年穷
学无止境,精益求精
闲着没事,看了一篇关于LINQ和SQL对比的文章,网友们也是积极发言,有人说LINQ简单,维护了程序的可读性,易用性。有人说:LINQ的执行本质其实就是SQL,再好的LINQ也需要转化为SQL后才能和数据库交互,LINQ效率低。
在此,表达下观点:本人支持后者,也就是SQL。
那么,在EF中,我们怎样执行SQL呢?
在此,先贴出几张图,如下:
1、

2、

3、

4、

根据上图,我们得知,图一,图二两个方法执行返回Int的方法,诸如:Insert操作,Update操作,delete操作。图三,图四返回DbRawSqlQuery的方法,诸如:Select操作。
何为DbRawSqlQuery类型?如下:

由此可见DbRawSqlQuery类型继承自泛型类型。因此,图三图四用于执行Select操作的SQL语句。
那么,我们该怎么使用呢?
图一示例
db.Database.ExecuteSqlCommand("delete语句 或 Update语句 或 Insert语句 ");
db.Database.ExecuteSqlCommand("delete语句 或 Update语句 或 Insert语句 ",params object[] parameters);

/// <summary>
/// 学生Id
/// </summary>
/// <param name="i"></param>
public StudentScore()
{
using (StudentContext db = new StudentContext())
{
int userid = 8;
string name = "Jack";
SqlParameter[] paras = new SqlParameter[] {
new SqlParameter("@userId",userid),
new SqlParameter("@searchName",name)
};
db.Database.ExecuteSqlCommand("delete from S where userId=@userId or UserName=@searchName", paras);
} }

图二实际上是执行存储过程:

public StudentScore()
{
using (StudentContext db = new StudentContext())
{
db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction,"exec ProcName ");
}
}

图三、图四执行查询操作,如下所示:

public class StudentScore
{
public IEnumerable<Student> StudentModel { get; set; }//
public IEnumerable<Course> CourseModel { get; set; }
public IEnumerable<Score> ScoreModel { get; set; }
//
public List<StudentScoreVM> StudentScoreList = new List<StudentScoreVM>(); public StudentScore()
{
}
/// <summary>
/// 学生Id
/// </summary>
/// <param name="i"></param>
public StudentScore(int Id)
{
using (StudentContext db = new StudentContext())
{
//返回StudentScoreVM对象集合 通过这种方式可实现ViewModel特性
StudentScoreList = db.Database.SqlQuery<StudentScoreVM>("select A.StudentScore,B.Name courseName,C.Name stuName,C.Sex,C.StudentAddress,C.StudentNum from dbo.Score A left join dbo.Course B on A.CourseID=B.Id left join dbo.Student C on A.StudentID=C.Id where 1=1 and C.Id=" + Id + "").ToList();
//返回查询结果的课程名集合
var stringList = db.Database.SqlQuery<string>("select B.Name courseName from dbo.Score A left join dbo.Course B on A.CourseID=B.Id left join dbo.Student C on A.StudentID=C.Id where 1=1 and C.Id=" + Id + "").ToList();
//返回查询结果的年龄集合
var intList= db.Database.SqlQuery<string>("select A.Age from dbo.Score A left join dbo.Course B on A.CourseID=B.Id left join dbo.Student C on A.StudentID=C.Id where 1=1 and C.Id=" + Id + "").ToList();
}
}
}

总结如下:
通过 SQL 查询语句获取实体对象集
DbSet 类中的 SqlQuery 方法允许你执行一个返回实体对象集的原生 SQL 查询. 默认情况下, 返回的对象集会被上下文跟踪; 这可以通过对方法返回的 DbSqlQuery 对象调用 AsNoTracking 方法取消.返回的结果集一般为 DbSet 所对应的类型, 否则即便是其派生类也无法返回. 如果所查询的表包含了其他实体类型的数据, 那么所执行的 SQL 语句应该被正确书写, 保证只返回指定类型实体的数据. 下面的例子使用 SqlQuery 方法执行了一个 SQL 查询, 返回一个 Department 类型的实例集.
让数据库执行原生的非查询 SQL 命令
ExecuteSqlCommand 方法有时会被用在 Code First 创建的数据库的初始化函数中, 用来对数据库进行一些额外的配置 (例如, 设置索引). 需要注意的是, 上下文对象并不知道执行了 ExecuteSqlCommand 方法后数据库中的数据有什么改变, 除非你从数据库中载入或重新载入实体集.
调用存储过程
Code First 并不支持对存储过程的映射. 但是, 你可以通过 ExecuteSqlCommand 或 SqlQuery 方法直接调用存储过程. 例如: context.Database.ExecuteSqlCommand ("EXECUTE [dbo].[DoSomething]").
译注: 本文提到的三个方法 (DbSet.SqlQuery, Database.SqlQuery, Database.ExecuteSqlCommand) 都支持参数化查询, 用法和 string.Format 类似, 但是在查询执行时会对传入的参数进行类型转换. 如: context.Departments.SqlQuery("select * from Department where DepartmentID = {0}", "6"); 该语句执行时, 会将字符串 "6" 转化为整数然后再代入查询语句中执行, 可以有效防止 SQL 注入.
防止 SQL 注入攻击
应用程序经常要从外部获取输入 (来自用户和其他外部代理) , 然后根据这些输入执行相关操作. 从用户或外部代理直接或间接获取的任何信息都可能利用目标程序语言的语法来执行违法操作. 当目标语言是结构化查询语言 (SQL) 时, 例如 Transact-SQL, 这个操作被称为 SQL 注入攻击. 恶意的用户可以直接在查询中注入命令执行操作, 删除数据库中的一个表, 拒绝提供服务或修改正在执行的操作的性质. 故你应该使用参数化的查询, 而不是直接将从外部获取的字符串插入到查询字符串中.
转载来源:https://www.cnblogs.com/chenwolong/p/SqlQuery.html
MVC EF 执行SQL语句(转载)的更多相关文章
- easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)
easyui datagrid 禁止选中行 没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) ...
- MVC EF 执行SQL语句
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 闲着没事,看了一篇关于LINQ和SQL对比的文章,网友们 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(89)-EF执行SQL语句与存储过程
这一节,我们来看看EF如何执行SQL语句与读取存储过程的数据,可能有一部分人,还不知道EF如何执行存储过程与原生SQL语句! 我们什么时候要直接使用原生的SQL语句? 返回值过于复杂 过于复杂的联合查 ...
- EF执行SQL语句
使用上下文中的Database.SqlQuery<对应的表名>(sql语句) var data = dbcenter.Database.SqlQuery<CcBusiFormview ...
- EF各版本增删查改及执行Sql语句
自从我开始使用Visual Studio 也已经经历了好几个版本了,而且这中间EF等框架的改变也算是比较多的.本篇文章记录下各个版本EF执行Sql语句和直接进行增删查改操作的区别,方便自己随时切换版本 ...
- 在EF中执行SQL语句(转载)
在EF中执行SQL语句 你可能要问,我用EF不就为了避免写SQL吗?如果要写SQL我不如直接用ADO.NET得了.话虽然这么说没错,可有些时候使用EF操作数据还是有一些不方便,例如让你根据条件删除 ...
- Asp.Net MVC EF之一:使用Database类在EF框架中执行Sql语句
引言 从EF6开始,增加了DateBase类,他通过从 DbContext 对象获取此类的实例.可用于管理支持数据库上下文或连接的实际数据库.这包括创建.删除和检查数据库的存在. 在6以前,我们使用E ...
- EF中执行sql语句,以及事务
EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...
- 在EF中执行SQL语句
你可能要问,我用EF不就为了避免写SQL吗?如果要写SQL我不如直接用ADO.NET得了.话虽然这么说没错,可有些时候使用EF操作数据还是有一些不方便,例如让你根据条件删除一组记录,如果按照正常的流程 ...
随机推荐
- To me
1.流泪的时候不做任何决定: 2.不反复思考同一个问题: 3.不害怕做错什么: 4.有负面情绪是正常的: 5.一切的烦恼都是自找的: 6.说过的话一定要做到: 7.不要去害怕做一件事: 8.无论是对是 ...
- C语言基础课第五次作业
PTA第五次作业 7-2 统计一行文本中的单词个数 一.程序代码 #include<stdio.h> int main(void) { ]; ,word=; char c; gets(st ...
- django的简单原理
一.自定义客户端和服务端的请求响应 1.客户端打开url,向服务器发出请求 2.服务端用socket写一个py,用于接收请求和做出响应 3.服务端接收请求 4.服务端模拟HTTP协议做出响应,状态行为 ...
- web安全基础
web安全备忘 主机系统安全防护:防火墙控制 Web是一个分布式系统,一个站点多个主机布置,一主机布置多个站点:并发,异步,同步 主机安全配置文件修改与强化 web站点数据验证逻辑的常用技巧:功能性代 ...
- Log4Cpp的使用(转)
本文介绍如何使用Log4CPP. Log4Cpp介绍 Log4Cpp的Api接口可以在http://log4cpp.sourceforge.net/api/index.html中查询得到. Log4C ...
- Python脱产8期 Day014 2019/4/28
一 带参装饰器 1.通常,装饰器为被装饰的函数添加新功能,需要外界的参数 # -- outer参数固定一个,就是func # -- inner参数固定同被装饰的函数,也不能添加新参数 # -- 可以借 ...
- Egg中使用egg-mongoose和常用的Mongoose 方法
Mongoose Mongoose就是一套操作MongoDB数据库的接口,而Egg中有对应的插件egg-mongoose. 安装 $ npm install egg-mongoose --save 配 ...
- .NET手记-ASP.NET MVC快速分页的实现
对于Web应用,展示List是很常见的需求,随之而来的常见的分页组件.jQuery有现成的分页组件,网上也有着大量的第三方分页组件,都能够快速实现分页功能.但是今天我描述的是用基本的C#和html代码 ...
- rest framework 尝鲜
安装 pip install djangorestframework 新建项目 python manage.py startapp idcs 添加模型(models.py) class Idcs(mo ...
- [EXP]McAfee ePO 5.9.1 - Registered Executable Local Access Bypass
# Exploit Title: McAfee ePO 5.9.1 Registered Executable Local Access Bypass # Date: 2019-03-07 # Exp ...