iT邦幫忙

0

Get & Set 存取資料庫方式

  • 分享至 

  • xImage

請教一下我若用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

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
天黑
iT邦研究生 5 級 ‧ 2022-02-14 14:17:53

其實跟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;}
}
看更多先前的回應...收起先前的回應...
Jason iT邦新手 4 級 ‧ 2022-02-14 14:31:48 檢舉

我知道與dapper無關,我只是描述我使用什麼方式抓出資料,這裏我看過了,我只是想知道當sql透過dapper抓出來時,倒給類別資料時是透過get 還是set

天黑 iT邦研究生 5 級 ‧ 2022-02-14 14:53:41 檢舉

set

Jason iT邦新手 4 級 ‧ 2022-02-14 15:55:43 檢舉

剛剛做了一個小實驗,將set拿掉,只留get,看來dapper在抓出資料庫的資料時會自動倒到對應的public string OrderId { get },而並非用set,而get是在我執行到automap TableC類別要轉到TableCDto時才會用到取資料get

Jason iT邦新手 4 級 ‧ 2022-02-14 15:58:03 檢舉

如果我只留set; 會出現自動實作的屬性必須要有 get 存取子。,看來set是無法單獨存在

Jason iT邦新手 4 級 ‧ 2022-02-14 16:01:36 檢舉

若我單獨只留get 那裏面的_tableC.OrderId = httpRequest.Form["OrderId"]; 就必需先拿掉,不然會出現
CS0200 無法指派為屬性或索引子 '_tableC.OrderId' -- 其為唯讀看來這個set主要是用在我送資料進去給他時會用到

天黑 iT邦研究生 5 級 ‧ 2022-02-14 16:42:50 檢舉

抱歉更正,有其他作法在邊有高手教學

Jason iT邦新手 4 級 ‧ 2022-02-15 09:17:59 檢舉

感謝horace_work熱心幫忙,高手的教學也看過,但太高了,雖然都是中文字,但看不懂高手要表達的是什麼

天黑 iT邦研究生 5 級 ‧ 2022-02-15 11:42:17 檢舉

內文調整了 使用Reflection直接設定沒有set的model,是用linepad寫的,dump改成列印值就可以正常顯示

Jason iT邦新手 4 級 ‧ 2022-02-16 13:42:04 檢舉

這樣說好了,我應該想問的問題是我有一個值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))
天黑 iT邦研究生 5 級 ‧ 2022-02-17 09:25:53 檢舉

通常是會寫方法提取值,而不是直接改變值(如果要改變從根源的SQL語法應該更容易),如果都用automap了,或許你可以考慮直接加在ForMember裡處理,這裡的第二個答案

Jason iT邦新手 4 級 ‧ 2022-02-17 14:58:24 檢舉

我目前是用PayStatus 取值,然後在經過PayStatusVirtual變換,最後在PayStatusVirtual用automap轉給Dto裏的PayStatus,只是不解為何不能直接在model裏的PayStatus處理,而是要透過轉來轉去很麻煩

天黑 iT邦研究生 5 級 ‧ 2022-02-17 15:59:33 檢舉

理論上 model我只當純粹資料模型,商業邏輯會另外抽一層處理,但這就看人了..

Jason iT邦新手 4 級 ‧ 2022-02-17 16:02:57 檢舉

我知道model基本上是不要寫東西是最好,但要寫時也不能寫,我請教過同事與看過網路上介紹,好像C#更以前的版本那時設定set get是比較麻煩,但好像可以像我說的這樣用,但最後好像改成不行回傳自已

我要發表回答

立即登入回答