在从EF切换成EFCore2.0的过程中,遇到了存储过程的实现问题。

在EF中调用存储过程,非常方便,能够直接将结果转换成对应的结果类。 如代码中的Database.SqlQuery<TElement>()

        public virtual List<StatsPlanCompleteAndAdjustItem> GetStatsPlanCompleteAndAdjustItem(DateTime minExecuteDate, DateTime maxExecuteDate, Guid organizationId)
{
var results = _dbContext.SqlQuery<StatsPlanCompleteAndAdjustItem>
("StatsPlanCompleteAndAdjustItem @minExecuteDate,@maxExecuteDate,@organizationId",
new SqlParameter("minExecuteDate", minExecuteDate), new SqlParameter("maxExecuteDate", maxExecuteDate), new SqlParameter("organizationId", organizationId)).ToList();
return results;
} public IEnumerable<TElement> SqlQuery<TElement>(string sql, params object[] parameters)
{
return this.Database.SqlQuery<TElement>(sql, parameters);
}

然而,在EF Core2.0中还没有实现存储过程的调用,没有sqlquery<T>方法。

查找网上基本采用RawSql的方式来实现。but有局限,需要用dbcontext中的dbset<entity>.FromSql方法,返回值是List<entity>,为啥要借用dbset呢,这个方法纯粹借用表查询的方法,好多存储过程返回的未必是entity,不能将存储过程的结果转换成自己想要的数据类型,所以非常棘手。感觉 不是efcore调用 存储过程的思路。

      using (var dataContext = new SampleDbContext()) {

           var categoryID = ;
var query = dataContext.Categories.FromSql($"GetCategoryById {categoryID}"); var result = query.ToList(); Assert.NotNull(result);
}

采用第二思路,用传统的sqlCommand方法,执行存储过程,利用executeReader读取结果后,采用反射将数据转换成想要的泛型结果

作为积极吃ef core这个螃蟹的人,积极记录分享这个笔记,供其他朋友参考。感觉给力的话,赞助点红包哈

        public virtual List<PerformancePlanCompleteAndAdjustItem> GetPerformancePlanCompleteAndAdjustItem(DateTime minExecuteDate, DateTime maxExecuteDate, Guid organizationId)
{
//注意直接只写存储过程名称,不用写参数名,跟原来写法不一样。
var results = _dbContext.SqlQuery<PerformancePlanCompleteAndAdjustItem>
("PerformancePlanCompleteAndAdjustItem",
new SqlParameter("minExecuteDate", minExecuteDate), new SqlParameter("maxExecuteDate", maxExecuteDate), new SqlParameter("organizationId", organizationId)).ToList();
return results;
}

  

public IEnumerable<TElement> SqlQuery<TElement>(string sql, params object[] parameters) where TElement:new ()
{
var connection = Database.GetDbConnection();
using (var cmd = connection.CreateCommand())
{
Database.OpenConnection();
cmd.CommandText = sql;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddRange(parameters);
var dr =cmd.ExecuteReader();
var columnSchema = dr.GetColumnSchema();
var data = new List<TElement>();;
while (dr.Read())
{
TElement item = new TElement();
Type type = item.GetType();
foreach (var kv in columnSchema)
{
var propertyInfo = type.GetProperty(kv.ColumnName);
if (kv.ColumnOrdinal.HasValue && propertyInfo != null)
{
//注意需要转换数据库中的DBNull类型
var value= dr.IsDBNull(kv.ColumnOrdinal.Value)?null:dr.GetValue(kv.ColumnOrdinal.Value);
propertyInfo.SetValue(item, value);
}
}
data.Add(item);
}
dr.Dispose();
return data;
}
}

  

EF切EFCore2.0存储过程问题的更多相关文章

  1. DotNetCore跨平台~EFCore2.0连接Mysql的烦恼-已解决

    回到目录 对于传统的nuget包,我们习惯上用官方或者大型组织的,因为它们比较考靠谱,但就在前两天.net core2.0发布后,我把efcore也升级到2.0了,mysql.EfCore也升级到支持 ...

  2. MVC5+EF6 完整教程17--升级到EFCore2.0(转)

    MVC5+EF6 完整教程17--升级到EFCore2.0 2017年08月22日 14:48:12 linux12a 阅读数:2814   EF Core 2.0上周已经发布了,我们也升级到core ...

  3. EF Core 1.0 和 SQLServer 2008 分页的问题

    EF Core 1.0 在sqlserver2008分页的时候需要指定用数字分页. EF Core1.0 生成的分页语句中使用了 Featch Next.这个语句只有在SqlServer2012的时候 ...

  4. ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First

    ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ...

  5. EF Core 1.0中使用Include的小技巧

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于EF Core暂时不支持Lazy Loading,所以利用Include来加载额外 ...

  6. .NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0简介

    .NET Core 1.0.ASP.NET Core 1.0和EF Core 1.0简介 英文原文:Reintroducing .NET Core 1.0, ASP.NET Core 1.0, and ...

  7. EF Core 2.0 新特性

    前言 目前 EF Core 的最新版本为 2.0.0-priview1-final,所以本篇文章主要是针对此版本的一些说明. 注意:如果你要在Visual Studio 中使用 .NET Core 2 ...

  8. MVC5+EF6 完整教程17--升级到EFCore2.0

    EF Core 2.0上周已经发布了,我们也升级到core 文章内容基于vs2017,请大家先安装好vs2017(15.3). 本篇文章主要讲下差异点,跟之前一样的就不再重复了. 文章目录(差异点): ...

  9. EF Core 2.0使用MsSql/Mysql实现DB First和Code First

    参考地址 EF官网 ASP.NET Core MVC 和 EF Core - 教程系列 环境 Visual Studio 2017 最新版本的.NET Core 2.0 SDK 最新版本的 Windo ...

随机推荐

  1. Cookie映射

    Cookie映射 第 5 章 Cookie映射 http://amp.ad.sina.com.cn/sax/doc/zh-CN/xhtml/bk01pt02ch05.xhtml 第 5 章 Cooki ...

  2. iOS,添加阴影

    self.layer.shadowOpacity = 0.5f; // 0.8深 0.3淡 shadowOpacity数值越大,阴影越浓

  3. unittest框架assert断言

    Pthon内部自带了一个单元测试的模块,\ pyUnit也就是:unittest 先介绍下unittest的基本使用方法: 1.import unittest2.定义一个继承自unittest.Tes ...

  4. xargs与管道的区别

    一.直观感受 echo '--help' | cat echo的输出通过管道定向到cat的输入, 然后cat从其标准输入中读取待处理的文本内容, 输出结果: --help echo '--help' ...

  5. matlab中的常用函数

    1.将变量a保存到a.txt,每个值中间用tab隔开 dlmwrite('a.txt',a,'\t'); 2.对比两个矩阵是否完全一样 isequal(a,b); %返回logic=1,则完全相同 3 ...

  6. wps去广告

    彻底解决WPS弹出热点广告.WPS购物图标的办法 方法一:(一定有效) https://www.cnblogs.com/ytaozhao/p/5654149.html 一直用WPS,但一直有一个问题迟 ...

  7. Eclipse ADT中的logcat不显示解决方法

    今天维护android的程序,也不知道几百年前写的,elipse,一个日志文件都不显示,做的想哭,我使用的方法二,这里给自己留一个备份,怕再忘记了   1.在Eclipse界面中找到DDMS,然后找到 ...

  8. OC仿QQ侧滑

    之前做侧滑用的控件的DDMenu,总感觉好像差了点什么,自己尝试写了一个,三层叠加,感觉效果不理想,偶然间看到了一篇博客,与大家分享,再次申明,该代码不是我写的,只是为了给自己留一个查找资料的机会 下 ...

  9. C++中关于new和delete的使用

    1.创建动态数组 数组类型的变量有三个重要的限制:数组长度固定不变,在编译时必须知道它的长度,数组只在定义它的块语句中存在.对于动态分配的数组,虽然长度是固定的,但是动态分配的数组不必在编译时知道其长 ...

  10. python进制转换及变量

    .编译型语言和解释型语言的区别? 答: () 编译型语言:是将所有源码编译完成二进制后才进行输出,运行快,执行效率高,时间周期长. ()解释型语言:逐行编译输出,执行效率相对慢,开发效率高, .Pyt ...