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

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

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

CREATE PROCEDURE dbo.SP_Branch_Month_Sells
@branchCode INT,
@transactionDate DATE
AS
SELECT
sn.jewelry_type AS JewelryType,
tr.[History Sign2] AS HistorySign2,
SUM(his.[Actual_Selling_Price]) AS Summary FROM dbo.History his
INNER JOIN dbo.[stock nature] sn
ON his.[Stock Type] = sn.stock_type
AND his.[Stock Group] = sn.stock_group
INNER JOIN dbo.[History Tran Code] tr
ON his.[Tran Code] = tr.[History Tran Code]
WHERE his.[Branch Code From] = @branchCode
AND sn.[jewelry_type] IN ( 1, 2, 3 )
AND tr.[History Sign2] IN ( 2, 7, 8, -2, -7, -8 )
AND DateDiff(mm,his.[Transaction Date],@transactionDate)=0
GROUP BY sn.jewelry_type, tr.[History Sign2]
GO

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

public class SellEntity
{
public Int16 JewelryType { get; set; }
public Int16 HistorySign2 { get; set; }
public decimal Summary { get; set; }
} public class SellConfig:EntityTypeConfiguration<SellEntity>
{
public SellConfig()
{
//EF 需要每个表都有一个键,这里的JewelryType并没有实际键的意义,只是为满足EF的要求
HasKey(u => u.JewelryType);
Property(u => u.JewelryType).HasColumnName("JewelryType");
Property(u => u.HistorySign2).HasColumnName("HistorySign2"); }
}

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

public class SellDTO
{
public int JewelryType { get; set; }
public int HistorySign2 { get; set; }
public decimal Summary { get; set; }
} public SellDTO[] GetSells(int branchCode, DateTime monthDate)
{
using(TrainContext ctx = new TrainContext())
{
var paramters = new SqlParameter[]
{
new SqlParameter("branchCode",SqlDbType.Int)
{ Value=branchCode},
new SqlParameter("transactionDate", SqlDbType.Date)
{
Value =monthDate.ToShortDateString()
}
};
//EO转换成DTO
return ctx.Sells.SqlQuery("EXEC dbo.SP_Branch_Month_Sells @branchCode,@transactionDate)", paramters)
.ToList().Select(u=>new SellDTO()
{
JewelryType = u.JewelryType,
HistorySign2 = u.HistorySign2,
Summary =
u.Summary
}).ToArray();

}
}

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

 public class SellBLL
{
public SellDTO[] GetSellByMonthAndBranchCode(int branchCode, DateTime monthDate)
{
var sellDAL = new SellDAL();
return sellDAL.GetSells(branchCode, monthDate);
}
}

下面进行单元测试:

[TestClass]
public class SellTests
{
[TestMethod]
public void GetSellByMonthAndBranchCodeTest()
{
SellBLL sellBLL = new SellBLL(); var sells = sellBLL.GetSellByMonthAndBranchCode(, DateTime.Today.AddDays(-));
}
}

测试结果

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

成功

使用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. python3-sorted

    排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比 ...

  2. [python 学习]正则表达式

    re 模块函数re 模块函数和正则表达式对象的方法match(pattern,string,flags=0) 尝试使用带有可选的标记的正则表达式的模式来匹配字符串.如果匹配成功,就返回匹配对象:如果失 ...

  3. 解决在mysql表中删除自增id数据后,再添加数据时,id不会自增1的问题

    https://blog.csdn.net/shaojunbo24/article/details/50036859 问题:mysql表中删除自增id数据后,再添加数据时,id不会紧接.比如:自增id ...

  4. 类数组对象与 arguments

    类数组对象:拥有一个 length 属性和若干索引属性的对象 var array = ['name', 'age', 'sex']; var arrayLike = { 0: 'name', 1: ' ...

  5. ES6基本用法

    es6是JS(JavaScript)的下一个版本. 新增了let命令,用来声明变量.变量在第一个花括号内有用,先声明后引用.不允许重复声明.存在暂时性死区. const声明一个只读的常量.一旦声明,常 ...

  6. map接口详解

    1.Map接口详解(1)映射(map)是一个存储键.键值对的对象,给定一个键,可以查询得到它的值,键和值都可以是对象(2)键必须是唯一的,值可以重复(Map接口映射唯一的键到值)(3)有些映射可以接收 ...

  7. 16 :IDEA快速键

    ctrol+z ctrol+shift+z  重做 复制,粘贴,删除,(行操作,光标放在那里就可以操作,不要全选择) 注:特别:查询出来,文件是可以直接编辑的 crtol+F double +shif ...

  8. BZOJ 3963: [WF2011]MachineWorks 斜率优化 + splay动态维护凸包

    Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先进的机械设备生产先进的机器.原来的那一台生产机器已经坏了,所以 ...

  9. C# windows窗口应用程序切换主界面的显示内容

    不知道说清楚没有?就是我的窗口分为两部分,左边,控制部分,由一些按钮组成右边,显示部分,由些控件(如下拉,文本等等组成) 左边的每个按钮对应显示部分的页面,也就是说,左边换一个按钮点,那么右边就显示其 ...

  10. 牛客提高D4t2 卖羊驼

    分析 不难想到dp[i][j]表示前i个数分了j组的最大值 我们发现这个dp状态有决策单调性 g[i][j]表示对于第i个数它的第j位最近出现的位置 每次一定从这些点转移 预处理即可 似乎还可以做到1 ...