前言

很长一段时间没有写博客了,今天补上一篇吧,偶尔发现不太愿意写博客了,太耗费时间,不过还是在坚持当中,毕竟或许写出来的东西能帮到一些童鞋吧,接下来我们直奔主题。无论是在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 = ; 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);
};

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

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[]
Stack trace:
...........

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

总结

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

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

  1. Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)

    Cookies   1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...

  2. EntityFramework Core上下文实例池原理分析

    前言 无论是在我个人博客还是著作中,对于上下文实例池都只是通过大量文字描述来讲解其基本原理,而且也是浅尝辄止,导致我们对其认识仍是一知半解,本文我们摆源码,从源头开始分析.希望通过本文从源码的分析,我 ...

  3. EF 6.x实现dynamic动态查询

    利用SqlQuery实现动态查询 public static IEnumerable<dynamic> SqlQueryDynamic(this DbContext db, string ...

  4. System.Linq.Dynamic 动态查询

    安装 VS->工具栏->NuGet程序管理器,System.Linq.Dynamic 注意: 使用动态查询必须先调用AsQueryable()方法,因为动态扩展仅适用于实现IQueryab ...

  5. MySQL官方.NET Core驱动已出,支持EF Core

    千呼万唤始出来MySQL官方.NET Core驱动已出,支持EF Core. 昨天MySQL官方已经发布了.NET Core 驱动,目前还是预览版,不过功能已经可用. NuGet 地址:https:/ ...

  6. NET Core驱动已出,支持EF Core

    NET Core驱动已出,支持EF Core 千呼万唤始出来MySQL官方.NET Core驱动已出,支持EF Core. 昨天MySQL官方已经发布了.NET Core 驱动,目前还是预览版,不过功 ...

  7. [翻译 EF Core in Action 1.9] 掀开EF Core的引擎盖看看EF Core内部是如何工作的

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  8. 特殊需求:EF 6.x如何比较TimeSpan格式的字符串?EF Core实现方式是否和EF 6.x等同?

    前言 我们知道C#中的TimeSpan对应SQL Server数据库中的Time类型,但是如果因为特殊需求数据库存储的不是Time类型,而是作为字符串,那么我们如何在查询数据时对数据库所存储的字符串类 ...

  9. 9.4 翻译系列:EF 6以及 EF Core中的NotMapped特性(EF 6 Code-First系列)

    原文链接:http://www.entityframeworktutorial.net/code-first/notmapped-dataannotations-attribute-in-code-f ...

随机推荐

  1. SpringMvc返回报文形式的控制-验证方法: JSON or HTML or XML

    首先,请求通过accept请求头声明了支持的返回格式 然后,框架根据该请求头和代码实现(注解)选择了对应的MessageConverter处理返回! 一.验证过程 1.返回html 1.1.请求组装 ...

  2. gradle入门(1-1)gradle的概念和使用

    一.Gradle是什么 Gradle是一种Java应用构建工具,它采用领域特定语言 Groovy 语法实现配置. 1.Gradle的基本概念 项目:项目的配置 即 build.gradle. 任务:任 ...

  3. eclipse使用git及github学习笔记

    项目托管 1.首先需要在github上建立一个远端仓库  点击Create repository后,会在github上建立相应的git仓库,并会出现如下界面: 复制https或者ssh的仓库地址,远端 ...

  4. Extensions in UWP Community Toolkit - ViewExtensions

    概述 UWP Community Toolkit Extensions 中有一个为 View 提供的扩展 - View Extensions,本篇我们结合代码详细讲解 View Extensions  ...

  5. Spark:reduceByKey函数的用法

    reduceByKey函数API: def reduceByKey(partitioner: Partitioner, func: JFunction2[V, V, V]): JavaPairRDD[ ...

  6. CSS Box Model 盒子模型

    1. 介绍 1.1 什么是 Box Model 在HTML中的每个element(元素)都可以看作一个矩形的盒子,矩形从内到外依次由元素的内容(content).内边距(padding).边框(bor ...

  7. Menu-多级菜单

    #menu多级菜单 from tkinter import * master = Tk() def callback(): print('我被调用了--') menubar=Menu(master)# ...

  8. WebGL文字渲染的那些问题

    THREE.js开发的应用运行在iphone5下发现有些时候会崩溃,跟了几天发现是因为Sprite太多频繁更新纹理占用显存导致的.通常解决纹理频繁更新问题就要用到one draw all方法,放到纹理 ...

  9. 关于ES6 的对象解构赋值

    之 前写了关于ES6数组的解构 现在 go on ; 解构不仅可以用于数组,还可以用于对象: 对象的解构和数组有一个重要的不同.数组的元素是按次序排列的,变量的取值是由他的位置决定的:而对象的属性没有 ...

  10. [LeetCode] Can Place Flowers 可以放置花

    Suppose you have a long flowerbed in which some of the plots are planted and some are not. However, ...