爱站网怎么打不开,中国城乡与建设部网站,手机端企业网站源码,创客oa管理系统前言很长一段时间没有写博客了#xff0c;今天补上一篇吧#xff0c;偶尔发现不太愿意写博客了#xff0c;太耗费时间#xff0c;不过还是在坚持当中#xff0c;毕竟或许写出来的东西能帮到一些童鞋吧#xff0c;接下来我们直奔主题。无论是在在EF 6.x还是EF Core中对于原… 前言很长一段时间没有写博客了今天补上一篇吧偶尔发现不太愿意写博客了太耗费时间不过还是在坚持当中毕竟或许写出来的东西能帮到一些童鞋吧接下来我们直奔主题。无论是在在EF 6.x还是EF Core中对于原始查询的APi都比较鸡肋比如我们只想查询单个值它们是不支持的比如我们只想有些列它们也是不支持的太多太多不支持唯一支持的是只能返回表中所有列即类中所有字段。所以大部分情况下我都是写原生SQL原始查询都没怎么用到过最近有对热爱EF的同行问到怎么利用SqlQuery实现动态查询我没有答案压根没想过用这个方法私下看了看还是给出一点点思考吧。若对您有帮助就好没有用就当是我补上了一篇博客吧。EF 6.x和EF Core实现动态查询public static IEnumerabledynamic 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 IDictionarystring, 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.DeserializeObjectListOrder(ordersJson); };当然上述我只是简单查询了一个表若您有多个表也是好使的最后反序列化为不同的对象即可未经测试您可自行测试。EF Core使用多个上下文实例池有很多人无论是在EF 6.x还是在EF Core中一直以来都是使用一个上下文但是不知我们是否有想过使用多个上下文呢比如在电商项目中对于产品相关操作我们可以使用产品上下文对于加入购物车操作使用购物车上下文对于订单操作使用订单上下文。这么做的好处是什么呢我们可以将数据库表也就说将实体拆分成不同的业务。至今我还没看到有人这么做过如果是我的话至少我会这么做。//Add DbContext var dbConnetionString Configuration.GetConnectionString(DbConnection); services.AddDbContextPoolShopCartDbContext(options { options.UseSqlServer(dbConnetionString); }).AddDbContextPoolBookDbContext(options { options.UseSqlServer(dbConnetionString); }).AddDbContextPoolOrderDbContext(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.DbContextOptions1[MultiContext.Contexts.BContext] cannot be used for constructor parameter of type Microsoft.EntityFrameworkCore.DbContextOptions1[MultiContext.Contexts.AContext] Parameter name: arguments[0]
Stack trace:
...........在此特性出来时大家都在欢呼能够提高性能对不起上下文实例池虽然可能在一定程度上提高性能但是我只能讲只能有可能的性能改进如果你知道或者看过EF Core实现上下文实例池的原理就明白了其实现的本质从而恍然大悟我所说的可能的性能上的改进是什么意思。至于为何不能注册多个上下文实例池我也是私下写项目遇见的具体请参看githubhttps://github.com/aspnet/EntityFrameworkCore/issues/9433。总结 好了今天就到这里没有过多的解释和叙述上来就是直奔主题最近思想放飞中对写博客慢慢失去了很大的兴趣偶尔感性中待我满血复活调节好心情再来和大家继续分享技术我一直在一段时间没写博客可能是因为累了又或者是私下在学习IdentityServer或者其他技术中干咱这行的除非转行那就老老实实积累经验和多学点技术吧年轻不奋斗那什么时候奋斗呢。今天说了啥胡思乱想中莫见怪。原文地址 https://www.cnblogs.com/CreateMyself/p/8921881.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com