这一节,我们来看看EF如何执行SQL语句与读取存储过程的数据,可能有一部分人,还不知道EF如何执行存储过程与原生SQL语句!

我们什么时候要直接使用原生的SQL语句?

  • 返回值过于复杂
  • 过于复杂的联合查询,可能连了好几张表
  • 报表自定义SQL语句(自定义报表居多)
  • 使用EF,但是写了一条性能很差的LINQ
  • 批量操作

所以实际开发中,我往往两合一处理

EF上下文 DbContext包含了DataBase属性,里面有很多方法,但是实际我们只需要用到个方法

ExecuteSqlCommand 和 SqlQuery

别小看这两个方法,他们其实有很多重载,不过操作我们以往的ADO.NET基本无异!

下面来看MSDN对于这两个方法的描述,我们直接看代码的描述就好,一看就是我们熟悉的ADO.NET操作方式

方法:ExecuteSqlCommand(String,Object[])

context.Database.ExecuteSqlCommand("UPDATE dbo.Posts SET Rating = 5 WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor));

方法:SqlQuery(String, Object[])

context.Database.SqlQuery("SELECT * FROM dbo.Posts WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor));

我们通过一个小例子来,来使用这2个方法

新建一个项目,并新增一个EF,并加入表InfoTest

CREATE TABLE [dbo].[InfoTest](
    ) PRIMARY key,
    ) NULL,
    ) NULL,
    [CreateTime] [datetime] NULL,
)

1.来看一段代码,创建和删除使用ExecuteSqlCommand

     static void Main(string[] args)
        {
            using (DBContainer db = new DBContainer())
            {
                //---------执行一条语句,带参数
                string sql = "INSERT INTO [dbo].[InfoTest]([Id],[Name],[Phone],[CreateTime])VALUES(@Id,@Name,@Phone,@CreateTime)";
                SqlParameter[] para = new SqlParameter[]
                {
                     new SqlParameter("@Id",Guid.NewGuid().ToString()),
                     new SqlParameter("@Name","中国移动"),
                     "),
                     new SqlParameter("@CreateTime",DateTime.Now),
                };
                //返回执行的影响行
                int count = db.Database.ExecuteSqlCommand(sql,para);
                Console.WriteLine("新增-带参数"+count);

                //----------执行一条语句,不带参数
                sql = "Delete [dbo].[InfoTest] where Name='中国移动'";
                count = db.Database.ExecuteSqlCommand(sql);
                Console.WriteLine("删除不带参数" + count);

            }
        }

注:带参数可以防止SQL注入,还是带参数好

2.来看一段查询的语句,使用SqlQuery

sql = "select * from InfoTest";
DbRawSqlQuery<InfoTest> dbRaw = db.Database.SqlQuery<InfoTest>(sql);

执行查询的语句,会返回 DbRawSqlQuery我们需要将其转换为我们熟悉的 IQueryable 或者 List来做进一步的数据库处理

3.我们还有一些异步的调用方法没有说明,跟同步是一致的

如:ExecuteSqlCommandAsync

4.使用存储过程

来看一个简单的存储过程

CREATE PROCEDURE SP_GetInfoTest
    )
AS
BEGIN
    select * from InfoTest where Phone=@Phone
END
GO

通过电话号码查一条记录,我们需要通过EF传过来参数,然后接收起返回值

看了上面的朋友,应该知道可以可以用使用SqlQuery来查询,没错,就是可以这样!

但是有时候我们还是要写存储过程,比如你的代码有几百行,那么用存储过程页面的代码看起来就好多了

把创建好的存储过程加入EF【右键更新模型】

第一步:将存储过程添加入EF

第二步:查看导入情况

现在的EF很聪明了,帮我们生成了返回值和函数导入,直接拿来使用就好

第三步:使用方式

//使用存储过程
List<SP_GetInfoTest_Result> spResult = db.SP_GetInfoTest(").ToList();
//进一步的操作
foreach (var r in spResult)
{
    Console.Write("来自存储过程的数据:"+r.Name + r.Phone);
}

参考:

Database这个类很强大。有事务,和其他方法,也是非常实用,可以了解一下

https://msdn.microsoft.com/zh-cn/library/system.data.entity.database(v=vs.113).aspx

代码下载:链接:https://pan.baidu.com/s/1qZ964fM 密码:hlyp

ASP.NET MVC5+EF6+EasyUI 后台管理系统(89)-EF执行SQL语句与存储过程的更多相关文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)

    开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB  升级后界面效果如下: 任务调度系统界面 http: ...

  2. ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入

    系列目录 前言 上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看: ASP.NET MVC5+EF6+EasyUI 后台管理系统(6 ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统-WebApi的用法与调试

    1:ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-WebApi与Unity注入 使用Unity是为了使用我们后台的BLL和DAL层 2:ASP.NET MVC5+EF6+Easy ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(转)

    开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 日程管理   http://ww ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级

    系统很久没有更新内容了,期待已久的更新在今天发布了,最近花了2个月的时间每天一点点,从原有系统 MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+E ...

  6. ASP.NET MVC5+EF6+EasyUI 后台管理系统(71)-微信公众平台开发-公众号管理

    系列目录 思维导图 下面我们来看一个思维导图,这样就可以更快了解所需要的功能: 上一节我们利用了一个简单的代码例子,完成了与微信公众号的对话(给公众号发一条信息,并得到回复) 这一节将讲解公众号如何设 ...

  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(84)-Quartz 作业调度用法详解一

    前言 我从Quartz2.0开始使用,并对其进行了封装了界面,可以参考 http://www.cnblogs.com/ymnets/p/5065154.html 最近拿出来进行了优化,并升级到最新版, ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(58)-DAL层重构

    系列目录 前言:这是对本文系统一次重要的革新,很久就想要重构数据访问层了,数据访问层重复代码太多.主要集中增删该查每个模块都有,所以本次是为封装相同接口方法 如果你想了解怎么重构普通的接口DAL层请查 ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(34)-文章发布系统①-简要分析

    系列目录 最新比较闲,为了学习下Android的开发构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(1)-前言与,虽然有点没有目的的学习,但还是了解了Andro ...

  10. ASP.NET MVC5+EF6+EasyUI 后台管理系统(54)-工作流设计-所有流程监控

    系列目录 先补充一个平面化登陆页面代码,自己更换喜欢的颜色背景 @using Apps.Common; @{ Layout = null; } <!DOCTYPE html> <ht ...

随机推荐

  1. SQLite 链接大全

    http://www.cnblogs.com/stephen-liu74/archive/2012/01/22/2328757.html

  2. JAVA 一句话技巧

    1.拆分字符串 遇到特殊字符,比如:对‘$’符号,就应该使用‘\\$’,后总结可以加个方括号如 "[.]".2.遍历HASHMAP Iterator itr = map.keySe ...

  3. Web前端学习(1):上网的过程与网页的本质

    "众里寻他千百度"--但是在信息化时代,我们只需要动动手指百度一下,google一下,便可以在网络上寻得我们想要查找的信息.我们或许都知道要如何在网上获得自己所需信息,但是上网的过 ...

  4. EL表达式得不到后台传过来的值

    两种jsp获得action传过来的值 第一种: <s:iterator value="#pagination.datas" var="supplier" ...

  5. protobuf java基础

    1:定义proto文件:   以一个地址薄为例,从建立一个.proto文件开始,为需要序列化的数据接口加入一个message属性,在message里面,为每一个字段指定名称和类型(算是IDL吧),如下 ...

  6. vue+springboot前后端分离实现单点登录跨域问题处理

    最近在做一个后台管理系统,前端是用时下火热的vue.js,后台是基于springboot的.因为后台系统没有登录功能,但是公司要求统一登录,登录认证统一使用.net项目组的认证系统.那就意味着做单点登 ...

  7. CDN页面刷新接口定义[高升]

    一 . 任务 分发 工作流程步骤 1. 合作方按照高升定义的 json 数据格式向高升分发接口 post 任务,高升分发接口会根据接收情况即时反馈接收成功还是失败的结果.二 . 高升 分发 接口 定义 ...

  8. 2017-07-09(tar who last)

    tar gzip ,bzip2对于文件目录压缩支持有限,所以出现了tar命令 tar [选项]  打包文件名  源文件 -c 打包 -v 显示过程 -f 指定打包文件名 -x 解包 -z 压缩成.ta ...

  9. Centos7-卸载自带的jdk 安装jdk8

    卸载JDK Centos7一般都会带有自己的openjdk,我们一般都回用oracle的jdk,所以要卸载 步骤一:查询系统是否以安装jdk #rpm -qa|grep java 或    #rpm ...

  10. php 利用Gd库添加文字水印乱码的问题及解决方案

    最近一个项目进行了服务器迁移,部署后发现 ,其中一个为图片添加水印文字的功能出现了乱码问题,确认功能代码不存在问题,同时项目代码都是使用UTF-8编码,不存在编码问题,也检查排除了字体文件出现问题的可 ...