EF切EFCore2.0存储过程问题
在从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存储过程问题的更多相关文章
- DotNetCore跨平台~EFCore2.0连接Mysql的烦恼-已解决
回到目录 对于传统的nuget包,我们习惯上用官方或者大型组织的,因为它们比较考靠谱,但就在前两天.net core2.0发布后,我把efcore也升级到2.0了,mysql.EfCore也升级到支持 ...
- MVC5+EF6 完整教程17--升级到EFCore2.0(转)
MVC5+EF6 完整教程17--升级到EFCore2.0 2017年08月22日 14:48:12 linux12a 阅读数:2814 EF Core 2.0上周已经发布了,我们也升级到core ...
- EF Core 1.0 和 SQLServer 2008 分页的问题
EF Core 1.0 在sqlserver2008分页的时候需要指定用数字分页. EF Core1.0 生成的分页语句中使用了 Featch Next.这个语句只有在SqlServer2012的时候 ...
- 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 ...
- EF Core 1.0中使用Include的小技巧
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于EF Core暂时不支持Lazy Loading,所以利用Include来加载额外 ...
- .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 ...
- EF Core 2.0 新特性
前言 目前 EF Core 的最新版本为 2.0.0-priview1-final,所以本篇文章主要是针对此版本的一些说明. 注意:如果你要在Visual Studio 中使用 .NET Core 2 ...
- MVC5+EF6 完整教程17--升级到EFCore2.0
EF Core 2.0上周已经发布了,我们也升级到core 文章内容基于vs2017,请大家先安装好vs2017(15.3). 本篇文章主要讲下差异点,跟之前一样的就不再重复了. 文章目录(差异点): ...
- 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 ...
随机推荐
- static的含义
static的含义:(1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍持上次的值:(2)限制变量的作用域,在模块 ...
- swf 文件解析
public class TagTypes { // Flash 1 tags public static const TAG_END:uint = 0; ...
- python摸爬滚打之day05----字典
1.字典介绍 1.1 结构: {key1: value1, key2: value2, ....} ,由很多键值对构成. 在字典的key-value(键值对)中, key(键)必须是可哈希(不可变 ...
- Javabean非空变量校验工具
摘要 调研java Class getDeclaredFields() 与getFields()的区别,设计请求参数为Javabean时,基于反射机制校验其中非空变量的公共方法. java Class ...
- CSS中position属性介绍(新增sticky)
position的含义是指定类型,取值类型可以有:static.relative.absolute.fixed.inherit 和 sticky,这里sticky是CSS3新发布的一个属性. 1.po ...
- webpack中loader和plugin的概念理解
对于 loader ,它就是一个转换器,将A文件进行编译形成B文件,这里操作的是文件,比如将 A.scss 或 A.less 转变成 B.css,单纯的文件转换过程: 对于 plugin,它就是一个扩 ...
- nginx 、springMvc(非分布式)相应的限流、消峰
互联网服务赖以生存的根本是流量, 产品和运营会经常通过各种方式来为应用倒流,比如淘宝的双十一等,如何让系统在处理高并发的同时还是保证自身系统的稳定, 通常在最短时间内提高并发的做法就是加机器, 但是如 ...
- ZedBoard上运行linux系统的准备工作框架
目标:ZedBoard上运行linux系统. 需要什么:图中上色部分. 应该做哪些工作:上色部分之前的所有步骤. 由上图得知,为了顺利在zedboard上构建嵌入式Linux操作系统,我们一般需要如下 ...
- JAVA四大域对象总结
根据有作用范围由小到大: page(jsp有效)------>page域指的是pageContext. request(一次请求)--->request域request HttpServl ...
- JS页面跳转代码怎么写?总结了5种方法
我们在建站时有些链接是固定的,比如客服咨询链接,一般是第三方url,如果直接加上去不太专业,那么就想着用站内的页面做跳转,跳转用js比较多,那么JS页面跳转代码怎么写呢?ytkah在网上搜索了一下,大 ...