以前寫PHP查詢出來都是數組也很容易去迴圈操作,突然用了.NET有點不習慣 不知道該如何去操作。
現在記錄下,利用泛型和反射將資料內容轉化成對應的實體類。
聽說效率很低,這個先不管了。能用就行。
public class Mapping {
public static T Entity<T>(IDataReader reader,Dictionary<string,int> dictionary) {
var type = typeof(T);
//T u = new T();
T u = Activator.CreateInstance<T>();
PropertyInfo[] field = type.GetProperties();
int index = -1;
foreach (var f in field) {
if (dictionary.TryGetValue(f.Name, out index)) {
var r = reader.GetValue(index);
if(r != DBNull.Value)
f.SetValue(u, r, null);
}
}
return u;
}
}
傳入的參數第一個不用解釋了,第二個參數我將代碼貼出來。
Dictionary<string, int> dictionary = new Dictionary<string, int>();
var dr = cmd.ExecuteReader();
int count = dr.FieldCount;
for (int i = 0; i < count; i++) {
dictionary.Add(dr.GetName(i), i);
}
這麼做只是為了方面下面反射的時候從字典中取得對應的屬性名稱和他所對應的鍵。
下面這是完整的查詢並轉化成實體類的代碼
public List<T> findAll<T>() {
var list = new List<T>();
//var parame = new List<QueryParameter>();
//parame.Add("uid");
Dictionary<string, int> dictionary = new Dictionary<string, int>();
using (SqlConnection conn = new SqlConnection(sqlConnectionString)) {
String sql = "SELECT uid,username FROM Users ORDER BY uid DESC";
SqlCommand cmd = new SqlCommand(sql, conn);
//SqlParameter p = new SqlParameter("@uid", 1);
//cmd.Parameters.Add(p);
conn.Open();
var dr = cmd.ExecuteReader();
int count = dr.FieldCount;
for (int i = 0; i < count; i++) {
dictionary.Add(dr.GetName(i), i);
}
while (dr.Read()) {
list.Add(Mapping.Entity<T>(dr,dictionary));
}
dr.Close();
conn.Close();
}
return list;
}