EF 6.x、EF Core实现dynamic动态查询和EF Core实现多个上下文实例池你了解多少?

前言

很长一段时间没有写博客了,今天补上一篇吧,偶尔发现不太愿意写博客了,太耗费时间,不过还是在坚持当中,毕竟或许写出来的东西能帮到一些童鞋吧,接下来我们直奔主题。无论是在在EF 6.x还是EF Core中对于原始查询的APi都比较鸡肋,比如我们只想查询单个值,它们是不支持的,比如我们只想有些列,它们也是不支持的,太多太多不支持,唯一支持的是只能返回表中所有列即类中所有字段。所以大部分情况下我都是写原生SQL,原始查询都没怎么用到过,最近有对热爱EF的同行问到怎么利用SqlQuery实现动态查询,我没有答案,压根没想过用这个方法,私下看了看,还是给出一点点思考吧。若对您有帮助就好,没有用就当是我补上了一篇博客吧。

EF 6.x和EF Core实现动态查询

public static IEnumerable<dynamic> SqlQueryDynamic(this DbContext db, string Sql, params SqlParameter[] parameters)

        {

            using (var cmd = db.Database.Connection.CreateCommand())

            {

                cmd.CommandText = Sql;


                if (cmd.Connection.State != ConnectionState.Open)

                {

                    cmd.Connection.Open();

                }


                foreach (var p in parameters)

                {

                    var dbParameter = cmd.CreateParameter();

                    dbParameter.DbType = p.DbType;

                    dbParameter.ParameterName = p.ParameterName;

                    dbParameter.Value = p.Value;

                    cmd.Parameters.Add(dbParameter);

                }


                using (var dataReader = cmd.ExecuteReader())

                {

                    while (dataReader.Read())

                    {

                        var row = new ExpandoObject() as IDictionary<string, object>;

                        for (var fieldCount = 0; fieldCount < dataReader.FieldCount; fieldCount++)

                        {

                            row.Add(dataReader.GetName(fieldCount), dataReader[fieldCount]);

                        }

                        yield return row;

                    }

                }

            }

        }

那么最终如上查询后返回动态集合,我们该如何转换为集合对象呢?我想都没想如下直接先序列化然后反序列化,若您有更好的解决方案,请自行实现即可。

using (var ctx = new EfDbContext())

            {

                ctx.Database.Log = Console.WriteLine;


                var dynamicOrders = ctx.SqlQueryDynamic("select * from dbo.Orders");

                var ordersJson = JsonConvert.SerializeObject(dynamicOrders);

                var orders = JsonConvert.DeserializeObject<List<Order>>(ordersJson);

            };

640?wx_fmt=png

当然上述我只是简单查询了一个表,若您有多个表也是好使的,最后反序列化为不同的对象即可,未经测试,您可自行测试。

EF Core使用多个上下文实例池

有很多人无论是在EF 6.x还是在EF Core中一直以来都是使用一个上下文,但是不知我们是否有想过使用多个上下文呢?比如在电商项目中,对于产品相关操作我们可以使用产品上下文,对于加入购物车操作使用购物车上下文,对于订单操作使用订单上下文。这么做的好处是什么呢?我们可以将数据库表也就说将实体拆分成不同的业务。至今我还没看到有人这么做过,如果是我的话,至少我会这么做。


//Add DbContext

            var dbConnetionString = Configuration.GetConnectionString("DbConnection");

            services.AddDbContextPool<ShopCartDbContext>(options =>

            {

                options.UseSqlServer(dbConnetionString);

            }).AddDbContextPool<BookDbContext>(options =>

            {

                options.UseSqlServer(dbConnetionString);

            }).AddDbContextPool<OrderDbContext>(options =>

            {

                options.UseSqlServer(dbConnetionString);

            });

在EF Core 2.0中有了上下文实例池,类似于ADO.NET中的连接池一样,但是这玩意你从表面理解那你就大错特错了,有关上下文实例池(从去年开始我着手写了一本关于EF 6.x和EF Core的书籍最近会出版)实现本质,只能说它和ADO.NET中的连接池不是一样的哦。那么如上述使用多个上下文实例池是否就一定好使呢?不好意思,这样配置是错误的。但运行程序你会发现抛出类似如下异常:

Exception message:
System.ArgumentException: Expression of type 'Microsoft.EntityFrameworkCore.DbContextOptions`1[MultiContext.Contexts.BContext]' cannot be used for constructor parameter of type 'Microsoft.EntityFrameworkCore.DbContextOptions`1[MultiContext.Contexts.AContext]' Parameter name: arguments[0]
Stack trace:
...........

在此特性出来时大家都在欢呼能够提高性能,对不起上下文实例池虽然可能在一定程度上提高性能,但是我只能讲只能有可能的性能改进,如果你知道或者看过EF Core实现上下文实例池的原理,就明白了其实现的本质从而恍然大悟我所说的可能的性能上的改进是什么意思。至于为何不能注册多个上下文实例池,我也是私下写项目遇见的,具体请参看github:https://github.com/aspnet/EntityFrameworkCore/issues/9433。

总结 

好了今天就到这里,没有过多的解释和叙述,上来就是直奔主题,最近思想放飞中,对写博客慢慢失去了很大的兴趣,偶尔感性中,待我满血复活调节好心情再来和大家继续分享技术,我一直在,一段时间没写博客可能是因为累了,又或者是私下在学习IdentityServer或者其他技术中,干咱这行的,除非转行那就老老实实积累经验和多学点技术吧,年轻不奋斗,那什么时候奋斗呢。今天说了啥,胡思乱想中,莫见怪。

原文地址 :https://www.cnblogs.com/CreateMyself/p/8921881.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1、play编程基础

1、Action、Controller、Result Action指的是动作&#xff0c;play中大多数请求可以使用action来处理&#xff0c;一个请求对应一个动作也就是一个java方法&#xff0c;然后处理请求返回一个响应&#xff0c;这个响应用Result来体现 Controller就是一个继承了 play.mvc.Contro…

【动态规划】城市交通

城市交通 Description 有n个城市&#xff0c;编号1~n&#xff0c;有些城市之间有路相连&#xff0c;有些则没有&#xff0c;有路则当然有一个距离。现在规定只能从编号小的城市到编号大的城市&#xff0c;问你从编号为1的城市到编号为n的城市之间的最短距离是多少&#xff1f…

AspNetCoreApi 跨域处理(CORS )

如果咱们有处理过MV5 跨域问题这个问题也不大。&#xff08;1&#xff09;为什么会出现跨域问题&#xff1a;浏览器安全限制了前端脚本跨站点的访问资源&#xff0c;所以在调用WebApi 接口时不能成功访问资源&#xff0c;原因“同源策略”的存在&#xff1a;同源指以下几点相同…

【动态规划】求最长不下降序列

求最长不下降序列求最长不下降序列求最长不下降序列 Description 设有n(n<1000)个不相同的整数(小于32767)组成的数列&#xff0c;记为&#xff1a; a1,a2,…,an,其中任意两个数不相同。 例如&#xff1a;3,18,7,14,10,12,23,41,16,24。 若有 且有 。则称为长度为e的不…

jzoj3860-地壳运动(mst)【最小生成树,三分】

正题 题目链接:https://jzoj.net/senior/#contest/show/3002/1 题目大意 nnn个点mmm条边&#xff0c;每条边有(u,v)(u,v)(u,v)两个权值。 qqq个询问&#xff0c;每次询问一个(k1,k2)(k1,k2)(k1,k2)&#xff0c;将所有边的权值变为u∗k1v∗k2u*k1v*k2u∗k1v∗k2后求最小生成树。…

读人人都是产品经理__2

1、做产品和做项目 对产品经理来说&#xff0c;最重要的是判断力和创造力&#xff0c;产品经理决定做不做、做什么&#xff0c;保证方向正确&#xff0c;要把它实现。对项目经理来说&#xff0c;最终的是执行力和控制力&#xff0c;项目经理决定怎么做&#xff0c;谁来做&#…

业务配置开发平台qMISPlat 2.0 产品介绍

qMISPlat是什么qMISPlat(业务配置开发平台)是一套基于.net core 2.0、跨平台的&#xff0c;面向开发人员和具有一定技术水平的业务人员使用的业务配置开发平台。基于此平台您只需通过配置和少量开发即可快速搭建满足用户需求的业务系统&#xff0c;大大降低项目开发工作量。平台…

jzoj2755-[2012东莞市选]树的计数【dp,高精度】

正题 题目链接:https://jzoj.net/senior/#main/show/2755 题目大意 求有多少个nnn个点直径为ddd的标号树。 解题思路 定义fi,jf_{i,j}fi,j​表示iii个点&#xff0c;深度不超过jjj的标号树数量。 然后有转移fi,j∑k1i−1Ci−2k−1∗k∗fk,j−1∗fi−k,jf_{i,j}\sum_{k1}^{i…

2、异步HTTP编程

1、处理异步结果 在内部&#xff0c;play框架是自下而上异步的。Play以异步、非阻塞方式处理每个请求。应用程序代码应尽量避免阻塞控制器&#xff0c;这种阻塞操作的常见例子有JDBC调用、流式API、HTTP请求和长计算。因此应尽量通过保持控制器异步的方法使得应用进行扩展&…

【动态规划】最大子矩阵之和

最大子矩阵 Description 给出一个N [2<N<100]&#xff0c;并给出一个N*N的矩阵&#xff0c;矩阵中的数为[-127,127]之间。求出矩阵中一块子矩阵的最大和。 比如&#xff1a; 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 和最大的子矩阵应该是这个&#xff1a; 9 2 …

3、play中的模板引擎

1、模板格式 Play默认的模板引擎是一种基于scala的安全模板引擎&#xff0c;尽管模板引擎使用Scala作为表达式语言&#xff0c;但是非常简单易学。参数类型使用后缀语法指定&#xff08;例如&#xff1a; id&#xff1a;Long&#xff09;&#xff0c;泛型类型是使用[]符号&…

jzoj3500-物语【最短路】

正题 题目链接:https://jzoj.net/senior/#contest/show/3005/0 题目大意 nnn个点mmm条边的无向图&#xff0c;有一条边的边权会变化&#xff0c;qqq次变化&#xff0c;每次询问最短路。 解题思路 可变边(x,y)(x,y)(x,y) 路径无非就三种 1−>n1->n1−>n1−>x−>…

Problem G. Graph 2015-2016 acmicpc neerc 拓扑排序模拟

一道好题 题目详见题目连接G graph 显然模拟拓扑排序的步骤是必不可少了。 假设我们当前有t个点&#xff0c;他们的入度均为0.我们不知道该选取哪一个。 我们把这t个点按从小到大排好序&#xff08;放入小顶堆&#xff09;&#xff0c;假设我们目前有k条边&#xff08;k &l…

【动态规划】石子合并

石子合并石子合并石子合并 Description 在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆&#xff0c;并将新的一堆石子数记为该次合并的得分。请设计一个程序&#xff0c;计算出将N堆石子合并成一堆的最小得分。…

.NET Core调用WCF的最佳实践

现在.NET Core貌似很火&#xff0c;与其他.NET开发者交流不说上几句.NET Core都感觉自己落伍了一样。但是冷静背后我们要也看到.NET Core目前还有太多不足&#xff0c;别的不多说&#xff0c;与自家的服务框架WCF集成起来就不咋地&#xff0c;从最初不支持&#xff0c;到现在有…

4、表单提交和验证

1、启用/禁用表单module sbt启动应用时默认就启用了表单&#xff0c;也可以在build.sbt中添加启用libraryDependencies javaForms&#xff0c;想要移除表单时使用PlayMinimalJava 插件 2、play接收表单数据 play.data中的类可用于处理HTTP表单数据提交和验证&#xff0c;操…

Boring Homework 二叉搜索树的打印,模拟

写了好长时间&#xff0c;注意递归的使用&#xff0c;思路一定要清晰。 还有注意的地方&#xff1a;打印的时候一定要先打印到缓存buffer中&#xff0c;然后再输出到屏幕上面。 #include <bits/stdc.h> using namespace std; int idx 0; int val[100],lft[100],rgt[100…

jzoj3501-消息传递【换根法,树形dp】

正题 题目链接:https://jzoj.net/senior/#contest/show/3005/1 题目大意 一棵树&#xff0c;一个信息开始给一个人&#xff0c;每次得到信息的人可以选择相邻节点中的一个传递&#xff0c;求最短多久可以传到所有人。 解题思路 我们先考虑如何求一根的答案&#xff0c;farif…

【贪心】最佳浏览路线问题

最佳浏览路线问题最佳浏览路线问题最佳浏览路线问题 题目描述 某旅游区的街道成网格状&#xff08;见图&#xff09;&#xff0c;其中东西向的街道都是旅游街&#xff0c;南北向的街道都是林荫道。由于游客众多&#xff0c;旅游街被规定为单行道。游客在旅游街上只能从西向东…

Ooui:在浏览器中运行.NET应用

在过去数年中&#xff0c;桌面应用开发人员一直处境艰难&#xff0c;因为人们的主要关注点聚焦于Web和移动应用。由于Microsoft未来Windows平台的计划未定&#xff0c;并且UWP应用也没有突破性进展&#xff0c;因此技术落伍的责任也不应由.NET开发人员来承担。当前迫切需要解决…