Asp.net core利用dynamic简化数据库访问

今天写了一个数据库的帮助类,代码如下。

public static class DbEx
{
    public static dynamic ReadToObject(this IDataReader reader)
    {
        var obj = new DbObject();

        for (int i = 0; i < reader.FieldCount; i++)
        {
            obj[reader.GetName(i)] = new DbField()
            {
                DbData = reader[i]
            };
        }

        return obj;
    }

    public class DbObject : DynamicObject
    {
        //自己实现一个,不用ExpandoObject, 以支持无视大小写读取
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = this[binder.Name];
            return true;
        }

        Dictionary<string, object> _values = new Dictionary<string, object>(StringComparer.CurrentCultureIgnoreCase);

        public object this[string index]
        {
            get => _values[index];
            set => _values[index] = value;
        }
    }

    public class DbField
    {
        public object DbData { get; set; }

        public T Value<T>()
        {
            return (T)Convert.ChangeType(DbData, typeof(T));
        }

        public static implicit operator string(DbField data) => data.Value<string>();
        public static implicit operator int(DbField data) => data.Value<int>();
        public static implicit operator DateTime(DbField data) => data.Value<DateTime>();
        public static implicit operator double(DbField data) => data.Value<double>();
        public static implicit operator bool(DbField data) => data.Value<bool>();
    }
}

简单的来讲,可以把如下代码

GpsData parse(IDataReader reader)
{
    return new GpsData()
    {
        IsValid = (bool)reader["IsValid"],
        Location = new Location ()
        {
            Lon = (double)reader["Lon"],
            Lat = (double)reader["Lat"],
        },
        Angle = (double)reader["Angle"],
        Speed = (double)reader["Speed"]),
        UpdateTime = (double)reader["Speed"]),
    };
}

转换为如下形式

GpsData parse(IDataReader reader)
{
    var obj = reader.ReadToObject();
    var state = new GpsData()
    {
        IsValid = obj.IsValid,
        Location = new Location()
        {
            Lon = obj.Lon,
            Lat = obj.Lat,
        },
        Angle = obj.Angle,
        Speed = obj.Speed,
        UpdateTime = obj.UpdateTime,
    };
    return state;
}

到此这篇关于Asp.net core利用dynamic简化数据库访问的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • .Net Core 使用NLog记录日志到文件和数据库的操作方法

    NLog 记录日志是微软官方推荐使用. 接下来,通过配置日志记录到文件和Sql Server数据库. 第一步:首先添加包NLog.Config (可通过微软添加包命令Install-Package 包名进行添加,也可以通过管理NuGet程序包进行添加),添加成功后会生成NLog.config配置文件.并对该配置文件进行配置.详细配置可参考Git上 NLog说明. 一下是我个人配置. <?xml version="1.0" encoding="utf-8" ?&

  • ASP.NET Core使用EF SQLite对数据库增删改查

    SQLIte 操作方便,简单小巧,这里笔者就不再过多介绍,感兴趣可以到以下博文 https://www.jb51.net/article/234142.htm 文章介绍创建ASP.NET Core 程序,创建模型.上下文,生成数据库,对数据库增删查改. 并对每个过程进行详细介绍,使初学者尽快了解内容和相关知识,避免对某一知识点怀疑.卡在某个位置. 1 新建ASP.NET Core MVC 应用 1.1 新建MVC应用 打开Visual Studio 2017,新建 ASP.NET Web应用程序

  • .net core下配置访问数据库操作

    配置读取 .net core下读取配置还是有点麻烦的,本身没有System.Configuration.dll,所以在进行配置前需要自行引用Microsoft.Extensions.Configuration,截图如下: 这样的话我们就可以配置读取的相关编码了,比如我们数据库的链接字符串,在appsettings.json添加对应的数据库配置: "ConnectionStrings": { "TestDb": "server=localhost;port=

  • ASP.NET Core基于现有数据库创建EF模型

    1.简介 Entity Framework Core可通过数据库提供给应用程序的插件访问许多不同的数据库.我们可以通过使用Entity Framework Core构建执行基本数据访问的ASP.NET Core MVC应用程序,对现有数据库进行反向工程以便创建Entity Framework模型. 2.创建数据库 我们可以通过Visual Studio创建一个数据库再进行演示,步骤如下:●打开Visual Studio开发工具●“工具”>“连接到数据库”●选择“Microsoft SQL Ser

  • .NET Core使用EF生成数据库出错的解决方法

    在.NET Core 项目钟(类库),使用Entity Framework,建立模型生成数据库时,失败 Could not load assembly 'xxx'. Ensure it is referenced by the startup project 'xxx'. 改成 64 位即可 假设 ef 代码 public class ApplicationDbContext : IdentityDbContext<User> { public ApplicationDbContext(DbC

  • EFCore 通过实体Model生成创建SQL Server数据库表脚本

    在我们的项目中经常采用Model First这种方式先来设计数据库Model,然后通过Migration来生成数据库表结构,有些时候我们需要动态通过实体Model来创建数据库的表结构,特别是在创建像临时表这一类型的时候,我们直接通过代码来进行创建就可以了不用通过创建实体然后迁移这种方式来进行,其实原理也很简单就是通过遍历当前Model然后获取每一个属性并以此来生成部分创建脚本,然后将这些创建的脚本拼接成一个完整的脚本到数据库中去执行就可以了,只不过这里有一些需要注意的地方,下面我们来通过代码来一

  • ASP.NET Core使用EF为关系数据库建模

    目录 1.简介 2.表映射 2.1约定 2.2数据注释 2.3Fluent API 3.列映射 3.1约定 3.2数据注释 3.3Fluent API 4.数据类型 4.1约定 4.2数据注释 4.3Fluent API 5.主键 5.1约定 5.2数据注释 5.3Fluent API 6.默认架构 6.1约定 6.2数据注释 6.3Fluent API 7.默认值 7.1约定 7.2数据注释 7.3Fluent API 8.索引(关系数据库) 8.1约定 8.2数据注释 8.3Fluent A

  • .NET Core配置连接字符串和获取数据库上下文实例

    假设数据库就两个表:User.Blogs, 模型类如下 public class User { public int Id { get; set; } public string Name { get; set; } public string Number { get; set; } public string Email { get; set; } } public class Blogs { public int Id { get; set; } public string BolgNam

  • Asp.net core利用dynamic简化数据库访问

    今天写了一个数据库的帮助类,代码如下. public static class DbEx { public static dynamic ReadToObject(this IDataReader reader) { var obj = new DbObject(); for (int i = 0; i < reader.FieldCount; i++) { obj[reader.GetName(i)] = new DbField() { DbData = reader[i] }; } retu

  • asp.net core利用AccessControlHelper实现控制访问权限

    Intro# 由于项目需要,需要在基于 asp.net mvc 的 Web 项目框架中做权限的控制,于是才有了这个权限控制组件,最初只是支持 netframework,后来 dotnetcore 2.0 发布了之后添加了对 asp.net core 的支持,在 dotnetcore 3.0 发布之后也增加了对 asp.net core 3.0 的支持(1.9.0及之后版本),目前对于 asp.net core 支持的更多一些,asp.net core 可以使用 TagHelper 来控制页面上元

  • Asp.net core利用IIS在windows上进行托管步骤详解

    摘要 最近项目中,尝试使用asp.net core开发,在部署的时候,考虑现有硬件,只能部署在windows上,linux服务器暂时没有.下面话不多说了,来一起看看详细的介绍吧. 部署注意事项 代码中启用iis和Kestrel public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[]

  • ASP.NET Core利用UrlFirewall对请求进行过滤的方法示例

    一. 前言 UrlFirewall 是一个开源.轻便的对http请求进行过滤的中间件,可使用在webapi或者网关(比如Ocelot),由我本人编写,并且开源在github:https://github.com/stulzq/UrlFirewall  (本地下载) 二.UrlFirewall 介绍 UrlFirewall 是一款http请求过滤中间件,可以和网关(Ocelot)搭配,实现屏蔽外网访问内部接口,只让内部接口之间相互通讯,而不暴露到外部.它支持黑名单模式和白名单模式,支持自定义htt

  • ASP.NET Core利用Jaeger实现分布式追踪详解

    前言 最近我们公司的部分.NET Core的项目接入了Jaeger,也算是稍微完善了一下.NET团队的技术栈. 至于为什么选择Jaeger而不是Skywalking,这个问题我只能回答,大佬们说了算. 前段时间也在CSharpCorner写过一篇类似的介绍 Exploring Distributed Tracing Using ASP.NET Core And Jaeger. 下面回到正题,我们先看一下Jaeger的简介 Jaeger的简单介绍 Jaeger是Uber开源的一个分布式追踪的工具,

  • Asp.Net Core利用文件监视进行快速测试开发详解

    前言 在进行 Asp.Net Core 应用程序开发过程中,通常的做法是先把业务代码开发完成,然后建立单元测试,最后进入本地系统集成测试:在这个过程中,程序员的大部分时间几乎都花费在开发.运行.调试上,而且一再的重复这个过程,我称这个过程为"程序员开发螺旋",并且在这个步骤中,重复率最高且没有创造力的工作就是启动.测试,作为程序员,努力提高生产力我们追求的目标,我们的工作就是尽量消灭重复劳动,解放生产力,提高产出效率: 下面就通过一个简单的例子来演示,如何通过文件监视进行快速开发. 本

  • Asp.Net Core利用xUnit进行主机级别的网络集成测试详解

    前言 在开发 Asp.Net Core 应用程序的过程中,我们常常需要对业务代码编写单元测试,这种方法既快速又有效,利用单元测试做代码覆盖测试,也是非常必要的事情:但是,但我们需要对系统进行集成测试的时候,需要启动服务主机,利用浏览器或者Postman 等网络工具对接口进行集成测试,这就非常的不方便,同时浪费了大量的时间在重复启动应用程序上:今天要介绍就是如何在不启动应用程序的情况下,对 Asp.Net Core WebApi 项目进行网络集成测试. 一.建立项目 1.1 首先我们建立两个项目,

  • ASP.NET对SQLServer的通用数据库访问类

    本文模仿实现数据库访问的通用类,代码清晰,而且很实用,包括了对数据库的所有的常用的操作. /// <summary> /// 数据库访问通用类 /// </summary> public class SqlHelper { private string connectionString; /// <summary> /// 设定数据库访问字符串 /// </summary> public string ConnectionString { set { con

  • Asp.net core利用MediatR进程内发布/订阅详解

    1.背景 最近,一个工作了一个月的同事离职了,所做的东西怼了过来.一看代码,惨不忍睹,一个方法六七百行,啥也不说了吧,实在没法儿说.介绍下业务场景吧,一个公共操作A,业务中各个地方都会做A操作,正常人正常思维应该是把A操作提取出来封装,其他地方调用,可这哥们儿偏偏不这么干,代码到处复制.仔细分析了整个业务之后,发现是一个典型的事件/消息驱动型,或者叫发布/订阅型的业务逻辑.鉴于系统是单体的,所以想到利用进程内发布/订阅的解决方案.记得很久之前,做WPF时候,用过Prism的EventAggreg

  • 浅谈ASP.NET Core 中jwt授权认证的流程原理

    1,快速实现授权验证 什么是 JWT ?为什么要用 JWT ?JWT 的组成? 这些百度可以直接找到,这里不再赘述. 实际上,只需要知道 JWT 认证模式是使用一段 Token 作为认证依据的手段. 我们看一下 Postman 设置 Token 的位置. 那么,如何使用 C# 的 HttpClient 访问一个 JWT 认证的 WebAPI 呢? 下面来创建一个 ASP.NET Core 项目,尝试添加 JWT 验证功能. 1.1 添加 JWT 服务配置 在 Startup.cs 的 Confi

随机推荐