efcore默认执行sql语句需要 dbContext.Set<T>().FromSqlRaw(sql, parameters);
必须定义具体的泛型参数T的实体类,然后在dbContext中包含 public virtual DbSet<User> User { get; set; },
如下函数可省去model的定义,也无需在dbContext中做额外操作,返回任意类型
public List<TResult> SqlQuery<TResult>(string sql, params object[] parameters) where TResult: class,new()
{
List<TResult> list = new List<TResult>();
using (var conn = dbContext.Database.GetDbConnection())
{
using (var comm = conn.CreateCommand())
{
try
{
conn.Open();
comm.CommandText = sql;
if (parameters != null)
comm.Parameters.AddRange(parameters);
//CommandBehavior.CloseConnection当SqlDataReader释放的时候,顺便把SqlConnection对象也释放掉
var dr= comm.ExecuteReader(CommandBehavior.Default);
while (dr.Read())
{
TResult t = new TResult();
for (var i = 0; i < dr.FieldCount; i++)
{
//类型mapper,有同名的字段或属性赋值否则丢弃
var columnName = dr.GetName(i);
var colDataType = dr.GetFieldType(i);
var val = dr.GetFieldValue<object>(i);
var field = t.GetType().GetField(columnName);
field?.SetValue(t, val);
var property = t.GetType().GetProperty(columnName);
property?.SetValue(t, val);
}
list.Add(t);
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (conn != null && conn.State != ConnectionState.Closed)
conn.Close();
}
}
}
return list;
}
达梦数据库使用
DmParameter sqlParameters = new DmParameter("pname", "zhangsan") ;
var list = SqlQuery<User>("select * from manage.user where username=:pname ", sqlParameters);