【实习】刚入职,公司要求完成两个任务,任务要求使用存储过程和事务,其中一个问题要获取存储过程的查询结果集。经过多方查找和自己的实践,终于找到了方法。这里记录一下。

看到的这篇文章中给出的例子是查询单个表的所有数据,但是我的要求是多表查询并获取其中的几个字段。而且我是使用POCO(POCO是指Plain Old Class Object,也就是最基本的CLRClass),还是和示例有诸多不同。这里我结合文章中的示例和自己的尝试,解决了这个问题

首先建立存储过程 可以看到 这里我只需要sn.jewelry_type ,tr.[History Sign2] ,SUM(his.[Actual_Selling_Price]) AS Summary这三个字段

  1. CREATE PROCEDURE dbo.SP_Branch_Month_Sells
  2. @branchCode INT,
  3. @transactionDate DATE
  4. AS
  5. SELECT
  6. sn.jewelry_type AS JewelryType,
  7. tr.[History Sign2] AS HistorySign2,
  8. SUM(his.[Actual_Selling_Price]) AS Summary
  9.  
  10. FROM dbo.History his
  11. INNER JOIN dbo.[stock nature] sn
  12. ON his.[Stock Type] = sn.stock_type
  13. AND his.[Stock Group] = sn.stock_group
  14. INNER JOIN dbo.[History Tran Code] tr
  15. ON his.[Tran Code] = tr.[History Tran Code]
  16. WHERE his.[Branch Code From] = @branchCode
  17. AND sn.[jewelry_type] IN ( 1, 2, 3 )
  18. AND tr.[History Sign2] IN ( 2, 7, 8, -2, -7, -8 )
  19. AND DateDiff(mm,his.[Transaction Date],@transactionDate)=0
  20. GROUP BY sn.jewelry_type, tr.[History Sign2]
  21. GO

然后根据这三个字段建立对应的实体类和配置类,虽然在数据库中并没有对应的表,这里的实体类只是作为存储过程的结果集的对应实体

  1. public class SellEntity
  2. {
  3. public Int16 JewelryType { get; set; }
  4. public Int16 HistorySign2 { get; set; }
  5. public decimal Summary { get; set; }
  6. }
  7.  
  8. public class SellConfig:EntityTypeConfiguration<SellEntity>
  9. {
  10. public SellConfig()
  11. {
  12. //EF 需要每个表都有一个键,这里的JewelryType并没有实际键的意义,只是为满足EF的要求
  13. HasKey(u => u.JewelryType);
  14. Property(u => u.JewelryType).HasColumnName("JewelryType");
  15. Property(u => u.HistorySign2).HasColumnName("HistorySign2");
  16.  
  17. }
  18. }

然后就可以使用EF调用存储过程来获取结果集并和实体类对应起来,注意这里我使用了DTO,

  1. public class SellDTO
  2. {
  3. public int JewelryType { get; set; }
  4. public int HistorySign2 { get; set; }
  5. public decimal Summary { get; set; }
  6. }
  7.  
  8. public SellDTO[] GetSells(int branchCode, DateTime monthDate)
  9. {
  10. using(TrainContext ctx = new TrainContext())
  11. {
  12. var paramters = new SqlParameter[]
  13. {
  14. new SqlParameter("branchCode",SqlDbType.Int)
  15. { Value=branchCode},
  16. new SqlParameter("transactionDate", SqlDbType.Date)
  17. {
  18. Value =monthDate.ToShortDateString()
  19. }
  20. };
    //EO转换成DTO
  21. return ctx.Sells.SqlQuery("EXEC dbo.SP_Branch_Month_Sells @branchCode,@transactionDate)", paramters)
  22. .ToList().Select(u=>new SellDTO()
  23. {
  24. JewelryType = u.JewelryType,
  25. HistorySign2 = u.HistorySign2,
  26. Summary = u.Summary
  27. }).ToArray();
  28. }
  29. }

这里是DAL层的代码,BLL层只是对参数做转发

  1. public class SellBLL
  2. {
  3. public SellDTO[] GetSellByMonthAndBranchCode(int branchCode, DateTime monthDate)
  4. {
  5. var sellDAL = new SellDAL();
  6. return sellDAL.GetSells(branchCode, monthDate);
  7. }
  8. }

下面进行单元测试:

  1. [TestClass]
  2. public class SellTests
  3. {
  4. [TestMethod]
  5. public void GetSellByMonthAndBranchCodeTest()
  6. {
  7. SellBLL sellBLL = new SellBLL();
  8.  
  9. var sells = sellBLL.GetSellByMonthAndBranchCode(, DateTime.Today.AddDays(-));
  10. }
  11. }

测试结果

拿到结果集 和直接在数据库查询的结果一致。

成功

使用EntityFramework调用存储过程并获取存储过程返回的结果集的更多相关文章

  1. EF中执行存储过程,获取output返回值

    EF不能直接支持执行存储过程,于是使用转化成执行SQL语句的形式,却怎么也获取不到output的值,折腾的好久,终于解决了,分享下曲折的经历: public int AddVote(int title ...

  2. 连接sqlServer数据库&jpa调用存储过程Java获取存储过程返回的多个结果集JAVA调用sqlserver存储过程的实现(返回多个结果集的实现)jdbc多结果集(getMoreResults)

    存储过程: BEGIN select * from teacher; SELECT * FROM student; END public Object GetMyBOProjectProductLis ...

  3. [Java]在xp系统下java调用wmic命令获取窗口返回信息无反应(阻塞)的解决方案

    背景:本人写了一段java代码,调用cmd命令“wmic ...”来获取系统cpu.mem.handle等资源信息.在win7操作系统下运行没有问题,在xp系统下却发现读取窗口反馈信息时无反应(阻塞) ...

  4. Shell $?获取函数返回值或者上一个命令的退出状态

    Shell $?获取函数返回值或者上一个命令的退出状态 来自:互联网 时间:2021-01-12 阅读:2 $? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态, ...

  5. Yii2.0调用sql server存储过程并获取返回值

    1.首先展示创建sql server存储过程的语句,创建一个简单的存储过程,测试用. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE P ...

  6. C#获取存储过程返回值和输出参数值的方法

    //转自网络,先留个底 1.获取Return返回值 //存储过程 //Create PROCEDURE MYSQL // @a int, // @b int //AS // return @a + @ ...

  7. C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息

      C#调用SQL中的存储过程中有output参数,类型是字符型的时候一定要指定参数的长度.不然获取到的结果总是只有第一字符.本人就是由于这个原因,折腾了很久.在此记录一下,供大家以后参考! 例如: ...

  8. SqlDataReader 获取存储过程返回值

    编写存储过程,获取不到返回值 附上代码: SqlDataReader reader = null;// totalRecords = ; try { SqlConnectionHolder conne ...

  9. SQL server 存储过程 C#调用Windows CMD命令并返回输出结果 Mysql删除重复数据保留最小的id C# 取字符串中间文本 取字符串左边 取字符串右边 C# JSON格式数据高级用法

    create proc insertLog@Title nvarchar(50),@Contents nvarchar(max),@UserId int,@CreateTime datetimeasi ...

随机推荐

  1. AOP切面详解

    一.spring-aop.xml文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns= ...

  2. 理解Promise (1)

    new Promise 需要传递一个执行器 (函数) 函数有两个参数 resolve reject promise 承诺 默认的状态是pengding 调用 resolve 表示成功 reject 表 ...

  3. Centos 的防火墙(firewalld,iptables)

    Centos系统防火墙介绍 概述: 1.Filewalld(动态防火墙)作为redhat7系统中变更对于netfilter内核模块的管理工具: 2.iptables service 管理防火墙规则的模 ...

  4. 了解卷积神经网络如何使用TDA学习

    在我之前的文章中,我讨论了如何对卷积神经网络(CNN)学习的权重进行拓扑数据分析,以便深入了解正在学习的内容以及如何学习它. 这项工作的重要性可归纳如下: 它使我们能够了解神经网络如何执行分类任务. ...

  5. Mysqldump导入数据库很慢的解决办法

    https://blog.csdn.net/xizaihui/article/details/53103049 1.MySQLdump导出的SQL语句在导入到其他数据库的时候会相当慢,甚至几十秒才处理 ...

  6. Flask之路由相关

    1.装饰器中的参数 @app.route("/info", methods=["GET", "POST"]) def student_inf ...

  7. 程序猿看了要xiao了

    一. 程序猿问科比:“你为什么这么成功? ”科比:“你知道洛杉矶凌晨四点是什么样子吗? ”程序猿:“知道,一般那个时候我还在写代码,怎么了?”科比:“额…….” 二. 女神:你能让这个论坛的人都吵起来 ...

  8. C#中给RICHTEXTBOX加上背景图片

    在系统自带的RichTextBox中是无法给它设置背景图片,但是我们在某些场合可能需要给RichTextBox设置背景图片.那么怎么实现这一想法呢?经过研究发现通过其它巧妙的途径可以给RichText ...

  9. Java学习、面试、求职、干货资源精品合集

    本系列文章整合了本号发表和转载过的,有关Java学习.进阶.面试.做项目.求职经验等方面的文章,希望对想要找工作,以及正在找工作的你,能够有所帮助. 原创Java学习专题文章: 如何才能够系统地学习J ...

  10. 前端每日实战:124# 视频演示如何用纯 CSS 创作一只纸鹤

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xagoYb 可交互视频 此视频是可 ...