以前写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; }
|
请发表评论