一、方法封装
public static class DbContextExtension
{
public static List<T> GetList<T>(this DbContext db, string sql, CommandType type=CommandType.Text, params DbParameter[] parameters)
{
try
{
using (DbConnection conn = db.Database.Connection)
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
using (DbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.CommandType = type;
cmd.Parameters.AddRange(parameters);
DataTable dt = new DataTable();
using (DbDataReader reader = cmd.ExecuteReader())
{
dt.Load(reader);
}
cmd.Parameters.Clear();
string json = dt.ToJson();
List<T> list = json.ToObject<List<T>>();
return list;
}
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
二、方法调用
int code = 0;
SqlParameter[] param = {
new SqlParameter("@year",year),
new SqlParameter("@userId",userId),
new SqlParameter("@code ",code){ Direction=ParameterDirection.Output}
};
List<EChartsDto<int>> data = new List<EChartsDto<int>>();
data = db.GetList<EChartsDto<int>>("[dbo].[proc_getRecordsByUser]", CommandType.StoredProcedure, param);
三、其他版本
public static class DbContextExtensions
{
public static IEnumerable<TElement> ExecuteProc<TElement>(this DbContext db, string sql, params object[] parameters) where TElement : new()
{
var connection = db.Database.GetDbConnection();
using (var cmd = connection.CreateCommand())
{
db.Database.OpenConnection();
cmd.CommandText = sql;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddRange(parameters);
var dr = cmd.ExecuteReader();
var columnSchema = dr.GetColumnSchema();
var data = new List<TElement>();
while (dr.Read())
{
TElement item = new TElement();
Type type = item.GetType();
foreach (var kv in columnSchema)
{
var propertyInfo = type.GetProperty(kv.ColumnName);
if (kv.ColumnOrdinal.HasValue && propertyInfo != null)
{
var value = dr.IsDBNull(kv.ColumnOrdinal.Value)
? null
: dr.GetValue(kv.ColumnOrdinal.Value);
if (value != null
&& propertyInfo.PropertyType != typeof(int)
&& propertyInfo.PropertyType != typeof(double))
{
value = value.ToString();
}
propertyInfo.SetValue(item, value);
}
}
data.Add(item);
}
dr.Dispose();
return data;
}
}
public static DataTable ExecuteProc(this DbContext db, string sql, params object[] parameters)
{
DataTable dt = new DataTable();
var connection = db.Database.GetDbConnection();
using (var cmd = connection.CreateCommand())
{
db.Database.OpenConnection();
cmd.CommandText = sql;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddRange(parameters);
SqlDataAdapter sda = new SqlDataAdapter((SqlCommand)cmd);
sda.Fill(dt);
return dt;
}
}
}