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

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