efcore执行sql查询(无需定义dbset<model>)

efcore默认执行sql语句需要 dataContext.Set<T>().FromSqlRaw(sql, parameters);

必须定义具体的泛型参数T的实体类,然后在dataContext中包含  public virtual DbSet<User> User { get; set; },

如下函数可省去model的定义,返回任意类型

 

public List<TResult> SqlQuery<TResult>(string sql, params object[] parameters) where TResult: class,new()
{
List<TResult> list = new List<TResult>();
using (var conn = dataContext.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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章