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 = ;
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 注入攻击. 恶意的用户可以直接在查询中注入命令执行操作, 删除数据库中的一个表, 拒绝提供服务或修改正在执行的操作的性质. 故你应该使用参数化的查询, 而不是直接将从外部获取的字符串插入到查询字符串中.
@陈卧龙的博客
MVC EF 执行SQL语句的更多相关文章
- MVC EF 执行SQL语句(转载)
MVC EF 执行SQL语句 最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 闲着没事,看了一篇关于LI ...
- easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)
easyui datagrid 禁止选中行 没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) ...
- 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语句和直接进行增删查改操作的区别,方便自己随时切换版本 ...
- 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操作数据还是有一些不方便,例如让你根据条件删除一组记录,如果按照正常的流程 ...
- 如何用VS EF连接 Mysql,以及执行SQL语句 和存储过程?
VS2013, MySQL5.7.18 , MySQL5.7.14 执行SQL语句: ztp_user z = new ztp_user(); object[] obj = new object[] ...
随机推荐
- CDOJ 435 (SCOI 2011) 糖果 Label:差分约束系统
糖果 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 131072/131072KB (Java/Others) Submit Stat ...
- BZOJ4154: [Ipsc2015]Generating Synergy
Description 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 Input 第一行一个数T,表示数据组数 接下来每组数据的第一 ...
- c# Dictionary的遍历和排序(转)
c#遍历的两种方式 for和foreach for: 需要指定首位数据.末尾数据.数据长度: for遍历语句中可以改变数据的值: 遍历规则可以自定义,灵活性较高 foreach: 需要实现ienume ...
- [LintCode] Continuous Subarray Sum 连续子数组之和
Given an integer array, find a continuous subarray where the sum of numbers is the biggest. Your cod ...
- GitHub上删除项目
1. 在自己的repositories中,选择要删除的项目,左击. 2. 选择 [Settings] 3. 选择 [Delete ** ] 4. 在弹出框中 输入 要删除的项目名,点击下方的按钮 ...
- Eclipse设置注释模板
设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元 ...
- hdu-acm steps 命运
/*表示刚刚接触dp.这是我接触到的第3道dp题,刚开始以为是要用dfs+dp,后来栈溢出...仔细想想, 其实这道题和数塔差不多,只要每步都得到最优子结构,最后结果一定是最优的.题目的初始化要做好, ...
- openoffice从word转pdf问题
http://www.oschina.net/question/227511_87517
- Mysql event学习
我们可能比较熟悉crond,但是mysql也有一个自己的叫event,oracle的叫job. 开启mysql的event有很多种方法,和临时开启.我们在配置文件里面添加参数,随着服务一起开启. 在[ ...
- fopen的第一个参数不能有'\n'
我刚才写了个程序, 需要操作两个文件. 我用fgets获取标准输入流stdin中的文件名, 然后用fopen打开. 结果编译器总是抱错. 调试了一下,发现fopen返回的是NULL. 我在此处加了 ...