zoukankan      html  css  js  c++  java
  • EF Core 拓展SqlQuery方法(转载)

    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;
            }
     
            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;
            }
     
            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;
            }
     
            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);
                    }
                }
            }

    使用:

    this.context.Database.SqlQuery<GetFeedbackLawyer_ReturnModel>("sql").ToList();
    出处:
    https://www.cnblogs.com/JoeyZJ/p/11819495.html
     
    完整代码:
    using Microsoft.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore.Infrastructure;
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Common;
    using System.Data.SqlClient;
    using System.Reflection;
    
    namespace DingTalk_Middleware.Models
    {
        /// <summary>
        /// EF Core 拓展SqlQuery方法
        /// </summary>
        public static class EF_Core_Ext
        {
            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;
            }
    
            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;
            }
    
            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;
            }
    
            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);
                    }
                }
            }

      public static bool ExecuteSqlCommand(this DatabaseFacade facade, string sql, params object[] parameters)
            {
                DbCommand cmd = CreateCommand(facade, sql, out DbConnection conn, parameters);
                try
                {
                    cmd.ExecuteNonQuery();
                    return true;
                }
                catch (Exception)
                {
                    return false;
                }
                finally
                {
                    conn.Close();
                }
            } } }
  • 相关阅读:
    Linux 配置yum源(互联网)
    Linux SSH远程链接 短时间内断开
    loadrunner12安装教程
    Jmeter关联处理
    JMeter做http接口压力测试
    面试试题库
    Selenium基础之--01(将浏览器最大化,设置浏览器固定宽、高,操控浏览器前进、后退)
    索引(快速查询)
    视图是什么玩意
    mysql面试常见题目3
  • 原文地址:https://www.cnblogs.com/datacool/p/12529573.html
Copyright © 2011-2022 走看看