1. 程式人生 > >懶漢處理dapper欄位名與屬性名的對映方式

懶漢處理dapper欄位名與屬性名的對映方式

你還以為走路是世上最簡單的事情呢?只不過是把一隻腳放到另一隻腳前面。但我一直很驚訝這些原本是本能的事情實際上做起來有多困難。而吃,吃也是一樣的,有些人吃起東西來可困難了。說話也是,還有愛。這些東西都可以很難。

--摘自蕾秋·喬伊斯《一個人的朝聖》

如題,專案的持久層用的是dapper,有一些複雜的報表需要自己編寫sql。 通過dapper返回一個泛型資料集合。這個泛型類T通常就是我們所定義的一個DTO,如下程式碼中的ZhifuDuizhangBaobiaoDTO。

開發過程中,資料表字段的命名並不規範,我在開發這個報表時重新定義了一下DTO的屬性名。這時,sql裡就要用到as了。

public
static List<ZhifuDuizhangBaobiaoDTO> GetDuizhangBaobiao(ZhifuDuizhangBaobiaoQueryModel query, PageModel pageModel) { string sql = @"SELECT ZFDate as 'OrderPayDate', OrderNo, orderId, ChannelNo, OrderAmount as 'Amount', orderst as 'OrderStatus', mercode FROM t_business_airorders a WHERE ZFDate>
[email protected]
AND ZFDate<@dateTo AND payType>1
"; // 引數值判斷 if (null != query.OrderNo && query.OrderNo.Trim() != "") { sql += " AND [email protected]"; query.OrderNo = query.OrderNo.Trim(); } if (null != query.ChannelNo && query.ChannelNo.Trim() != ""
) { ...... } var dp = new Object(); dp = new { dateFr = query.OrderPayDateFr.Date, dateTo = query.OrderPayDateTo.Date.AddDays(1), OrderNo = query.OrderNo, ChannelNo = query.ChannelNo, }; sql += " order by a.ZFDate desc"; using (var conn = ConnUtility.GateWayConntion) { var pagedList = conn.MySqlPageList<ZhifuDuizhangBaobiaoDTO>(sql, pageIndex: pageModel.PageNo, pageSize: pageModel.PageSize, param: dp); pageModel.RecordCount = pagedList.recordCount; var lst = pagedList.listT; return lst.ToList(); } }

與前端的檢視頁聯調通過後,這樣的程式碼可以fix了。

不過,上面的程式碼其實是有隱形錯誤的——當日後重命名ZhifuDuizhangBaobiaoDTO的OrderPayDate、Amount屬性時,很容易忽略這段sql文本里的as。

那麼,為了能應對日後的擴充套件和重構,我採用了另一種方式,利用linq的Expression表示式來讀取屬性名。 

public static List<ZhifuDuizhangBaobiaoDTO> GetDuizhangBaobiao(ZhifuDuizhangBaobiaoQueryModel query, PageModel pageModel)
{
    string sql = @"SELECT ZFDate as '{0}', OrderNo, orderId, ChannelNo, OrderAmount as '{1}', orderst as '{2}', mercode
FROM t_business_airorders a
WHERE ZFDate>[email protected] AND ZFDate<@dateTo
AND payType>1 ";

    sql = string.Format(sql, GetPropertyName<ZhifuDuizhangBaobiaoDTO>(c => c.OrderPayDate),
        GetPropertyName<ZhifuDuizhangBaobiaoDTO>(c => c.Amount),
        GetPropertyName<ZhifuDuizhangBaobiaoDTO>(c => c.OrderStatus));

    ......
}

 這裡藉助了一個GetPropertyName<T>方法。

public static string GetPropertyName<T>(Expression<Func<T, object>> expr)
{
    var rtn = "";
    if (expr.Body is UnaryExpression)
    {
        rtn = ((MemberExpression)((UnaryExpression)expr.Body).Operand).Member.Name;
    }
    else if (expr.Body is MemberExpression)
    {
        rtn = ((MemberExpression)expr.Body).Member.Name;
    }
    else if (expr.Body is ParameterExpression)
    {
        rtn = ((ParameterExpression)expr.Body).Type.Name;
    }
    return rtn;
}

 墨菲定律裡有說“會出錯的事總會出錯”。一個在開發中的專案,經常因review或程式碼分析而改一些程式碼的。這樣就一勞永逸了。日後重構屬性名,我們就不用擔心這塊了。

BTW,在MVC檢視頁裡,我們要顯示模型的顯示名稱,經常這樣寫@Html.DisplayNameFor(model => model.OrderPayDate),當屬性沒有DisplayNameAttribute時,就會返回屬性名。

今天突然想到了“懶漢”這個詞,是為了紀念一位在公司待過一段時間的老產品經理,周緣昕。我們公司的企業用車產品能夠在企業出行市場佔據一席之地,少不了他的傾心貢獻。NB之大,百度一下,你就知道。曾參加他給產品部門的一個培訓,其中談到了產品設計的“懶漢思維”。一個產品經理把一個需求設計合理並講清楚,並不是一件容易的事情。同樣,後期的運營跟進同樣不是易事。  之於系統開發方面,又何嘗不是呢。在我去年的文章《運維一個應用系統不容易(2016-07-29 18:43)》裡有一些嘮叨。

相關推薦

懶漢處理dapper屬性對映方式

你還以為走路是世上最簡單的事情呢?只不過是把一隻腳放到另一隻腳前面。但我一直很驚訝這些原本是本能的事情實際上做起來有多困難。而吃,吃也是一樣的,有些人吃起東西來可困難了。說話也是,還有愛。這些東西都可以很難。 --摘自蕾秋·喬伊斯《一個人的朝聖》 如題,專案的持久層用的是

【MyBatis】解決資料庫名稱Java實體類屬性名稱不一致問題

問題描述:       有時候在專案中會遇到資料庫欄位名稱與實體類屬性名稱取得不一樣的情況,如下:      資料庫裡的資料為:       此時,如果我們查詢該表的某條資料,Proj

MyBatis_Study_003(字段屬性名稱不一致,resultMap)

nts p標簽 ins imp drive for ase type屬性 column 源碼:https://github.com/carryLess/mbtsstd-003 1.主配置文件 <?xml version="1.0" encoding="UTF-8"

型別合理的選擇型別

欄位型別 數值 MySQL 的數值資料型別可以大致劃分為兩個類別,一個是整數,另一個是浮點數或小數。許多不同的子型別對這些類別中的每一個都是可用的,每個子型別支援不同大小的資料,並且 MySQL 允許我們指定數值欄位中的值是否有正負之分(UNSIGNED)或者用零填補(ZEROFILL)。 INT

【規範建議】服務端介面返回型別iOS端的解析

一、本文件的寫作目的   App需要跟產品、UI、後臺、伺服器、測試打交道,app的產出是其他端人員產出的綜合體現。與其他端人員溝通就像是開發寫介面,也就是面向介面程式設計的思想。   本文件講解針對的是服務端返回資料時使用的欄位資料型別如何選擇、iOS端將JSON資料轉模型的時候用什麼型別來定義對應的屬

powerdesigner 不顯示錶只顯示錶

在空白的地方右鍵選擇 Display Preferences 然後在左邊的General Settings裡選Table 然後把Columns 的All Columns勾上 如果能幫上您,請選為滿意答案,這樣我就有更多的動力去幫助更多的人,謝謝!

Mysql 【order by 不唯一【limit】混用的坑

背景: 分頁查詢排序後的資料,是一個非常常見的業務場景;但當使用不唯一的欄位排序時,分兩頁查詢的資料可能出現同一條資料,並丟失資料! 示例: 同樣的查詢條件,offset不同,竟然取到了同一條

[一]class 檔案淺析 .class檔案格式詳解 方法屬性常量池 class檔案屬性表 資料型別 資料結構

ClassFile { u4 magic;//唯一作用是確定這個檔案是否為一個能被虛擬機器所接受的class檔案。魔數值固定為0xCAFEBABE,不會改變 u2 minor_version;//唯一作用是確定這個檔案是否為一個能被虛擬機器所接受的class檔案。魔數值固定為0xCAFEBABE,不會

mysql資料庫修改資料庫編碼,編碼表編碼

 1.修改資料庫的編碼   將資料庫(test)的編碼方式修改為utf8,如:   ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; 2.修改表的編碼   將表(test)的編碼方式修改為ut

Python類中的"私有"和"私有屬性"

@staticmethod def Forward(): print u'開始向前進'#coding:utf-8 class Car: # 下面是靜態欄位 memo = u'車輛具有出廠合格證' def __init__(self, brand, model, sp

sql 處理資料為空 如果為空轉換成別的值

判斷欄位是否為空,如果為空轉成你要的字元 1.oracle : nvl(“欄位名”,’轉換後的值’);//欄位名是雙引號,轉換後的值是單引號 2.sql Server: isnull(“欄位名”

Oracle PL/SQL處理CLOB的經驗

http://space.itpub.net/111631/viewspace-605827 這段時間在客戶現場處理SP處理模版內容替換的技術問題,如果是單點的處理,當然非常簡單,使用replace就可以解決問題,但是需要將關鍵TAG替換成動態行數呢?這就比較麻煩了,下面是處

查詢資料庫中帶有某個的所有表

mysql資料庫查詢帶有某個欄位的所有表名 SELECT * FROM information_schema.columns WHERE column_name='column_name'; ora

Oracle處理Clob 轉換請求無法實現或不合理

處理clob(使用java.io.Reader)的時候出現,ORA-01460: 轉換請求無法實現或不合理從oracle 9i R2匯出程式到oracle 10G R2版本,作業系統是從Hp UX到RED HAT LINUX X64版本,剛開始以為是字符集的問題,我以為是量的

mysql——時間型別C#中datetime

一、引言 做專案的時候開始糾結於用2013-01-01 12-12-12儲存還是用 2013-01-01儲存,這個設計到的問題是mysql中時間欄位的選擇問題:date、time或者datetime

[C#] (field),屬性(property) 以及 get 和 set

欄位應該永遠為私有,私有欄位自然是不許使用者隨便訪問的,而屬性實際上是一個寫法有些特別的函式,為私有欄位的訪問提供介面,也就是通過屬性讀取私有域,或修改私有域,目的就是實現安全訪問。 Java和C++都通過函式實現對私有變數的修改和訪問,C#改成了屬性的方式。

mysql 在修改新增(alter table 表 add column 或者 modify column)且帶unique時提示duplicate entry for key的原因以及解決方案

今天在公司臨時維護一張表時,我作了一個小動作,新增一個欄位,並且設定為unique時,盡然無法新增欄位,我當時就納悶了,寫了這麼多sql,這麼奇怪的問題還是第一次見,不多說,直接看圖 【我的sql檔案如下】 【執行sql語句報錯:alter table smart_

查詢資料庫的 sql語句 返回 和類 屬性的關係

資料庫的資料表 實體類 package exer; public class Student { //流水號 private int flowId; //考試的型別 private int type; //身份證號 private String idCa

C#為什麼用屬性封裝?

我們知道,類成員包括變數和方法。如果希望其他類能夠訪問成員變數的值,就必須定義成公有的,而將變數設為公有public,那這個成員變數的就可以被任意訪問(包括修改,讀取),這樣不利於資料安全。那怎麼辦呢? C#通過屬性特性讀取和寫入欄位(成員變數),而不直接直接讀取和寫入,以

PB資料視窗物件之的修改屬性

資料視窗只能修改一個數據表。當資料視窗的資料來源於不止一個數據表時,可以用指令碼控制資料視窗的修改屬性來對資料表逐個進行修改。 當資料視窗是用來接受使用者的手工錄入資料時,應該設定兩方面的屬性才能確保資料視窗能夠用來修改資料表。一個是修改資料視窗的修改屬性,另一個是使用者