datareader轉dictionary有不少用處,能夠輸出表中部分字段轉實體字段,之前須要所有字段輸出或者再建一個實體模型才行,這樣就能夠減小數據庫的輸出量了,特別是某些接口的格式化輸出很方便。數據庫
先看底層代碼部分json
/// <summary> /// DataReader轉Dictionary<string, object>數據類型/// </summary> /// <param name="dataReader"></param> /// <param name="close"></param> /// <returns></returns> public static List<Dictionary<string, object>> GetListDictionary(IDataReader dataReader, bool close = true) { List<Dictionary<string, object>> list = new List<Dictionary<string, object>>(); if (close) { using (dataReader) { while (dataReader.Read()) { list.Add(DataFillDictionary(dataReader)); } } } else { while (dataReader.Read()) { list.Add(DataFillDictionary(dataReader)); } } return list; } /// <summary> /// 將DataReader數據轉爲Dictionary<string, object>對象/// </summary> /// <param name="reader"></param> /// <returns></returns> public static Dictionary<string, object> DataFillDictionary(IDataReader reader) { Dictionary<string, object> dict = new Dictionary<string, object>(); for (int i = 0; i < reader.FieldCount; i++) { try { dict.Add(reader.GetName(i), reader.GetValue(i)); } catch { dict.Add(reader.GetName(i), null); } } return dict; }
調用this
private void GetWebUserList(HttpContext context) { string jsonResult = string.Empty; var modifiedOn = context.Request["modifiedOn"]; var list = new List<Dictionary<string, object>>(); using (var dbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.UserCenterDbType, BaseSystemInfo.UserCenterDbConnection)) { try { using (var dr = new BaseUserManager(dbHelper).GetWebUserList(modifiedOn)) { if (dr != null) { list = DbLogic.GetListDictionary(dr); } } var timeConverter = new IsoDateTimeConverter { DateTimeFormat = BaseSystemInfo.DateTimeFormat }; jsonResult = JsonConvert.SerializeObject(list, Formatting.Indented, timeConverter); } catch (Exception ex) { NLogHelper.Warn(ex, "GetWebUserList異常"); } finally { dbHelper.Close(); } } }
獲取數據的方法spa
/// <summary> /// 向官網同步用戶信息 /// 只傳部分字段 /// </summary> /// <returns></returns> public IDataReader GetWebUserList(string modifiedOn) { string commandText = "SELECT A." + BaseUserEntity.FieldId + " ,A." + BaseUserEntity.FieldUserName + " ,A." + BaseUserEntity.FieldRealName + " ,A." + BaseUserEntity.FieldCode + " ,A." + BaseUserEntity.FieldCompanyId + " ,A." + BaseUserEntity.FieldCompanyName + " ,A." + BaseUserEntity.FieldCompanyCode + " ,B." + BaseUserContactEntity.FieldMobile + " ,B." + BaseUserContactEntity.FieldModifiedOn + " FROM " + BaseUserEntity.TableName + " A " + " LEFT JOIN " + BaseUserContactEntity.TableName + " B " + " ON A." + BaseUserEntity.FieldId + " = B." + BaseUserContactEntity.FieldId; // 不傳時間 一條記錄也不要給 if (!string.IsNullOrWhiteSpace(modifiedOn)) { var dbParameters = new List<KeyValuePair<string, object>>(); //查詢條件參數集合 commandText += " WHERE B." + BaseUserContactEntity.FieldModifiedOn + " > TO_DATE(" + this.DbHelper.GetParameter(BaseUserContactEntity.FieldModifiedOn + ",'yyyy-MM-dd HH24:mi:ss')"); // songbiao 作一下限制 commandText += " AND ROWNUM <= 300"; dbParameters.Add(new KeyValuePair<string, object>(BaseUserContactEntity.FieldModifiedOn, modifiedOn)); return this.DbHelper.ExecuteReader(commandText, dbHelper.MakeParameters(dbParameters)); } return null; }
輸出code
上面輸出的是數據庫字段,咱們只需改下查詢語句(field as modelfield),也能夠輸出實體屬性。orm
能夠有選擇輸出表中部分字段,這個方法加上好處不少。對象