摘要:A:DataReader 直接绑定,B: DataReader直接转换成EntityCollection,C:用Reflection将DataReader转换成EntityCollection,三种方式到底速度差多少?
用2000笔数据作试验。测试下来,直接转换成EntityCollection所化的时间与直接绑定相差无几,大概是1~1.5倍,用Reflection将DataReader转换成EntityCollection所化时间是直接绑定的4~5倍左右,用注释起来的代码的话花的时间就多了,大概8倍的样子。
但是转化成EntityCollection,还要写代码来处理排序。
直接绑定大致如此
private void BindByDirect(SqlDataReader dr) { contactData.DataSource= dr; contactData.DataBind(); }
用EntityCollection
private void BindByEntityCollection(SqlDataReader dr) { ContactCollection contacts = new ContactCollection(); while(dr.Read()) { Contact contact = new Contact(); contact.Contact_ID = dr["Contact_ID"].ToString(); contact.Contact_LastName = dr["Contact_LastName"].ToString() ; contact.Contact_JobTitle = dr["Contact_JobTitle"].ToString(); contact.Contact_Department = dr["Contact_Department"].ToString(); contact.Contact_Rank = dr["Contact_Rank"].ToString(); contacts.Add(contact); } contactData.DataSource= contacts; contactData.DataBind(); }
借助反射
private void BindByReflection(SqlDataReader dr) { ContactCollection contacts = new ContactCollection(); Type objType = typeof(Contact); PropertyInfo[] properties = objType.GetProperties(BindingFlags.Public | BindingFlags.Instance); Type fieldAttributeType = typeof(FieldAttribute);
while(dr.Read()) { //Contact contact = new Contact(); //foreach (PropertyInfo property in properties) //{ // FieldAttribute fieldAttribute = (FieldAttribute) Attribute.GetCustomAttribute( // property, fieldAttributeType);
// property.SetValue(contact,dr[fieldAttribute.ColumnName].ToString(),null); //} object instance = Activator.CreateInstance(objType, true); for (int i=0; i < properties.Length; i++) { FieldAttribute[] fieldAttributes = (FieldAttribute[])properties[i].GetCustomAttributes(fieldAttributeType, true); if (fieldAttributes.Length > 0) { properties[i].SetValue(instance, dr[fieldAttributes[0].ColumnName].ToString(), null); } } contacts.Add(instance ); } contactData.DataSource= contacts; contactData.DataBind(); } }
public class Contact{ string contact_ID; [FieldAttribute("Contact_ID")] public string Contact_ID { get {return contact_ID;} set {contact_ID = value;} }}...[
阅读全文]