請教一下我若用dapper抓資料庫裏的表格資料
TableC _tableC = new TableC()
sql="SELECT OrderId FROM [tables]";
retData = _cn.QueryFirstOrDefault<T>(sql, _tableC);
public class TableC
{
public string OrderId { get; set; }
}
這時抓出資料庫的資料倒入TableC類別裏的OrderId是用get還是set
其實跟dapper沒有太大的關係,get set 是縮寫,相關介紹可以參考這邊
Reflection 簡易範例
model property 沒有set使用Reflection設定內容
void Main()
{
Test temp = new Test();
Console.WriteLine($"first print");
temp.num.Dump();
Type fieldsType = typeof(Test);
FieldInfo[] fields = fieldsType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (var item in fields)
{
item.SetValue(temp,123);
}
Console.WriteLine($"second print");
temp.num.Dump();
}
public class Test {
public int num {get;}
}
我知道與dapper無關,我只是描述我使用什麼方式抓出資料,這裏我看過了,我只是想知道當sql透過dapper抓出來時,倒給類別資料時是透過get 還是set
set
剛剛做了一個小實驗,將set拿掉,只留get,看來dapper在抓出資料庫的資料時會自動倒到對應的public string OrderId { get },而並非用set,而get是在我執行到automap TableC類別要轉到TableCDto時才會用到取資料get
如果我只留set; 會出現自動實作的屬性必須要有 get 存取子。,看來set是無法單獨存在
若我單獨只留get 那裏面的_tableC.OrderId = httpRequest.Form["OrderId"]; 就必需先拿掉,不然會出現
CS0200 無法指派為屬性或索引子 '_tableC.OrderId' -- 其為唯讀看來這個set主要是用在我送資料進去給他時會用到
抱歉更正,有其他作法在邊有高手教學
感謝horace_work熱心幫忙,高手的教學也看過,但太高了,雖然都是中文字,但看不懂高手要表達的是什麼
內文調整了 使用Reflection直接設定沒有set的model,是用linepad寫的,dump改成列印值就可以正常顯示
這樣說好了,我應該想問的問題是我有一個值PayStatus裏面對應存資料庫時會有1or2, 但因為會有 PayType他會有a or b, 當PayType =a時PayStatus = 3
當PayType =b時 PayStatus = 4,我簡化條件比喻,實際不只一個PayType值,所以我原本以為dapper會將我select資料用set倒入到PayStatus 所以我原本將PayStatus寫成這樣, 但我看get set用法,在set這裏好像不能回傳自已PayStatus
要另外設定一個private byte payStatus, 但這樣就不是我要的,而且dapper select倒入時也不會用set進入
public byte PayStatus {
get { return PayStatus; }
set
{
if (PayType == 1)
PayStatus = 3;
else if (PayType == 2)
PayStatus = 4;
}
public string PayType { get; set; }
public byte PayStatus { get; set; }
所以後來改成
public byte? PayStatus { get; set; }
public byte? PayStatusVirtual
{
get {
if ((PayStatus == 1 && PayType != "a"))
{
return 3;
}
if ((PayStatus == 1 && PayType != "b"))
{
return 3;
}
return PayStatus;
}
}
最後在用automap轉回PayStatus
.ForMember(target => target.PayStatus, option => option.MapFrom(source => source.PayStatusVirtual))
通常是會寫方法提取值,而不是直接改變值(如果要改變從根源的SQL語法應該更容易),如果都用automap了,或許你可以考慮直接加在ForMember裡處理,這裡的第二個答案