zoukankan      html  css  js  c++  java
  • EFCoreExtension

    由于EFCore执行SQL和存储过程有局限性,只针对DataSet<T>,所以写一个扩展,能返回自定义对象集合

    using Microsoft.Data.SqlClient;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore.Infrastructure;
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Common;
    using System.Reflection;
    
    namespace RD.Common
    {
        /// <summary>
        /// EFCoreExtension
        /// </summary>
        public static class EFCoreExtension
        {
            /// <summary>
            /// 执行SQL查询,返回对象集合
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="facade"></param>
            /// <param name="sql"></param>
            /// <param name="parameters"></param>
            /// <returns></returns>
            public static List<T> SqlQuery<T>(this DatabaseFacade facade, string sql, params object[] parameters) where T : class, new()
            {
                var dt = SqlQuery(facade, sql, parameters);
                return dt.ToList<T>();
            }
            private static DbCommand CreateCommand(DatabaseFacade facade, string sql, out DbConnection connection, params object[] parameters)
            {
                var conn = facade.GetDbConnection();
                connection = conn;
                conn.Open();
                var cmd = conn.CreateCommand();
                if (facade.IsSqlServer())
                {
                    cmd.CommandText = sql;
                    if (parameters != null && parameters.Length > 0) cmd.Parameters.AddRange(parameters);
                }
                return cmd;
            }
            /// <summary>
            /// 执行SQL查询,返回DataTable
            /// </summary>
            /// <param name="facade"></param>
            /// <param name="sql"></param>
            /// <param name="parameters"></param>
            /// <returns></returns>
            private static DataTable SqlQuery(this DatabaseFacade facade, string sql, params object[] parameters)
            {
                var command = CreateCommand(facade, sql, out DbConnection conn, parameters);
                var reader = command.ExecuteReader();
                var dt = new DataTable();
                dt.Load(reader);
                reader.Close();
                conn.Close();
                return dt;
            }
            /// <summary>
            /// DataTable转List
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="dt"></param>
            /// <returns></returns>
            private static List<T> ToList<T>(this DataTable dt) where T : class, new()
            {
                var propertyInfos = typeof(T).GetProperties();
                var list = new List<T>();
                foreach (DataRow row in dt.Rows)
                {
                    var 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);
                    }
                    list.Add(t);
                }
                return list;
            }
            /// <summary>
            /// 生成参数
            /// </summary>
            /// <param name="dto"></param>
            /// <returns></returns>
            public static SqlParameter[] CreateParamArray(List<Dtos.InKeyValueDto> dto)
            {
                if (dto == null || dto.Count <= 0) return null;
                var param = new List<SqlParameter>();
                dto.ForEach(x =>
                {
                    param.Add(new SqlParameter(x.Key, x.Value));
                });
                return param.ToArray();
            }
        }
    }
    

      

  • 相关阅读:
    Subversion学习笔记
    单元测试 学习笔记 之五
    单元测试 学习笔记 之四
    将全球通讯簿导入pop3客户端联系人
    isa 2006 sp1发布
    使用POWERSHELL管理OCS 2007
    SCCM 2007 排错
    空空排错日志:OCS错误日志14501等解决办法
    在AD没有备份的情况下还原被删除的数据
    冲击波又回来啦?
  • 原文地址:https://www.cnblogs.com/jasonlai2016/p/14318024.html
Copyright © 2011-2022 走看看