• 使用EFCore执行上下文不存在的SQL语句


    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Common;
    using System.Data.SqlClient;
    using System.Reflection;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore.Infrastructure;
    
    namespace ZR.OtnWebService.Models.OrderInfos
    {
        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.IsMySql())
                {
                    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;
            }
    
            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;
            }
        }
    }

    使用方法

    DbContext.Database.SqlQuery<Model>($"SELECT * FROM Table").FirstOrDefault();

    需引用

    pomelo.entityframeworkcore.mysql

  • 相关阅读:
    生成器
    迭代器
    装饰器
    闭包函数
    函数对象
    函数
    文件
    字符编码
    基本的数据类型和内置方法02
    基本的数据类型和内置方法01
  • 原文地址:https://www.cnblogs.com/ShenJA/p/13335668.html
Copyright © 2020-2023  润新知