开发随笔记录——自定义DatabaseFacade的约定扩展类,实现自定义SQL查询返回数据(用于报表等复杂数据查询)。
2021/8/6 19:09:11
本文主要是介绍开发随笔记录——自定义DatabaseFacade的约定扩展类,实现自定义SQL查询返回数据(用于报表等复杂数据查询)。,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
声明:本文章将仅供保存以及参考,倘若涉及到利益问题,请联系博主进行删除,万分感谢。
前提:①本文章基于ASP.NET Core 3.1
②已安装Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.SqlServer、Microsoft.EntityFrameworkCore.Tools
创建DatabaseFacade约定扩展类DbContextExtensions.class,如下代码:
public static class DbContextExtensions { private static void CombineParams(ref DbCommand command, params object[] parameters) { if (parameters != null) { foreach (SqlParameter parameter in parameters) { if (!parameter.ParameterName.Contains("@")) parameter.ParameterName = $"@{parameter.ParameterName}"; command.Parameters.Add(parameter); } } } private static DbCommand CreateCommand(DatabaseFacade facade, string sql, out DbConnection dbConn, params object[] parameters) { DbConnection conn = facade.GetDbConnection(); dbConn = conn; conn.Open(); DbCommand cmd = conn.CreateCommand(); if (facade.IsSqlServer()) { cmd.CommandText = sql; CombineParams(ref cmd, parameters); } return cmd; } public static DataTable SqlQuery(this DatabaseFacade facade, string sql, params object[] parameters) { DbCommand cmd = CreateCommand(facade, sql, out DbConnection conn, parameters); DbDataReader reader = cmd.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(reader); reader.Close(); conn.Close(); return dt; } /// <summary> /// datatable转换为需要的类型 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dt"></param> /// <returns></returns> public static T Convert<T>(this DataTable dt) { if (dt == null) return default(T); string data = JsonConvert.SerializeObject( dt, Formatting.None, new DataTableConverter()); return JsonConvert.DeserializeObject<T>(data); } /// <summary> /// DataTable转json字符串 /// </summary> /// <param name="dt"></param> /// <returns></returns> public static string ConvertJson(this DataTable dt) { if (dt == null) return ""; string data = JsonConvert.SerializeObject( dt, Formatting.None, new DataTableConverter()); return data; } public static IEnumerable<T> SqlQuery<T>(this DatabaseFacade facade, string sql, params object[] parameters) where T : class, new() { DataTable dt = SqlQuery(facade, sql, parameters); return dt.ToEnumerable<T>(); } public static IEnumerable<T> ToEnumerable<T>(this DataTable dt) where T : class, new() { PropertyInfo[] propertyInfos = typeof(T).GetProperties(); T[] ts = new T[dt.Rows.Count]; int i = 0; foreach (DataRow row in dt.Rows) { T t = new T(); foreach (PropertyInfo p in propertyInfos) { if (dt.Columns.IndexOf(p.Name) != -1 && row[p.Name] != DBNull.Value) p.SetValue(t, row[p.Name], null); } ts[i] = t; i++; } return ts; } }
之后即可在开发环境中正常使用,如下:
_MyContext.Database.SqlQuery("select * from table").Convert<IEnumerable<object>>(); _MyContext.Database.SqlQuery<Table>("select * from table").ToList();
现在就可以用自己定义的SQL去查询复杂的数据源了。
这篇关于开发随笔记录——自定义DatabaseFacade的约定扩展类,实现自定义SQL查询返回数据(用于报表等复杂数据查询)。的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-29Excel中实现拖动排序的简易教程
- 2024-11-29如何在Excel中使用拖动排序功能
- 2024-11-28阿里云 ECS课程:新手入门教程
- 2024-11-27Excel中实现拖动排序的简单教程
- 2024-11-27Rocket消息队列资料:新手入门指南
- 2024-11-27rocket消息队资料详解与入门指南
- 2024-11-27RocketMQ底层原理资料详解入门教程
- 2024-11-27RocketMQ项目开发资料:新手入门教程
- 2024-11-27RocketMQ项目开发资料详解
- 2024-11-27RocketMQ消息中间件资料入门教程