如何高效的将 DataReader 转成 ListT ?
生活随笔
收集整理的這篇文章主要介紹了
如何高效的将 DataReader 转成 ListT ?
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
咨詢區(qū)
Anthony:
我在使用第三方工具包,它返回了一個 DataReader,為了能更方便的使用,我希望有一種快捷方法能夠?qū)⑺D(zhuǎn)成 List<T>,除了一行一行的迭代賦值之外還有其他好的方式嗎?
回答區(qū)
pim:
可以用反射實現(xiàn),雖然性能低一點,但它可以幫你自動化的將 DataReader 映射到 List<T> 上,這里的 T 可以是你的任意類型,參考如下代碼:
public?static?class?DataRecordHelper {public?static?void?CreateRecord<T>(IDataRecord?record,?T?myClass){PropertyInfo[]?propertyInfos?=?typeof(T).GetProperties();for?(int?i?=?0;?i?<?record.FieldCount;?i++){foreach?(PropertyInfo?propertyInfo?in?propertyInfos){if?(propertyInfo.Name?==?record.GetName(i)){propertyInfo.SetValue(myClass,?Convert.ChangeType(record.GetValue(i),?record.GetFieldType(i)),?null);break;}}}} }public?class?Employee {public?int?Id?{?get;?set;?}public?string?LastName?{?get;?set;?}public?DateTime??BirthDate?{?get;?set;?}public?static?IDataReader?GetEmployeesReader(){SqlConnection?conn?=?new?SqlConnection(ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString);conn.Open();using?(SqlCommand?cmd?=?new?SqlCommand("SELECT?EmployeeID?As?Id,?LastName,?BirthDate?FROM?Employees")){cmd.Connection?=?conn;return?cmd.ExecuteReader(CommandBehavior.CloseConnection);}}public?static?IEnumerable?GetEmployees(){IDataReader?rdr?=?GetEmployeesReader();while?(rdr.Read()){Employee?emp?=?new?Employee();DataRecordHelper.CreateRecord<Employee>(rdr,?emp);yield?return?emp;}} }Phil Cooper:
對于你的需求,建議使用 Dapper 做這種映射,參考如下代碼:
public?List<CustomerEntity>?GetCustomerList() {using?(DbConnection?connection?=?CreateConnection()){return?connection.Query<CustomerEntity>("procToReturnCustomers",?commandType:?CommandType.StoredProcedure).ToList();} }CreateConnection() 它用來創(chuàng)建數(shù)據(jù)庫連接,然后 Dapper 內(nèi)部會通過 ILEmit 的方式實現(xiàn) DataReader 和 Properties 之間的自動映射,非常方便。
Mohsen:
我有一個好辦法,既不需要引用 ORM 組件,也不需要手工寫反射,借助 DataTable 和 JsonConvert 即可, 參考如下代碼:
public?static?void?Main(){var?dt?=?new?DataTable();dt.Load(yourDataReader);//?creates?a?json?array?of?objectsstring?json?=?Newtonsoft.Json.JsonConvert.SerializeObject(dt);//?this?is?what?you're?looking?for?right??List<YourEntityType>?list?=?Newtonsoft.Json.JsonConvert.DeserializeObject<List<YourEntityType>>(json);}點評區(qū)
我個人在開發(fā)中,數(shù)據(jù)庫用 Dapper ,DTO之間用 AutoMapper,非常方便,大家可以參考參考。
總結(jié)
以上是生活随笔為你收集整理的如何高效的将 DataReader 转成 ListT ?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: blazor wasm开发chrome插
- 下一篇: 手把手教你学Dapr - 6. 发布订阅