簡體   English   中英

使用LINQ和C#將行從一個表復制到另一個表

[英]Copying a row from one table to another using LINQ and C#

我有兩個表,它們幾乎是彼此的精確克隆(相同的列,只是將不同的列設置為主鍵)。 基本上,第二個表僅用於保留第一個表的歷史記錄。 我需要做的是,當用戶更新表1中的記錄時,我需要將該記錄的原始副本插入表2中。

我正在使用LinqDataSource對象,並利用LinqDataSource_Updating(object sender, LinqDataSourceUpdateEventArgs e)事件,所以我可以訪問e.OriginalObject ,這對於在表2中插入原始行是完美的。我的問題是我不想必須手動設置每個屬性,因為其中大約有50個,因此我想使用Reflection,但不確定如何正確處理它。

考慮以下代碼:

INSTRUMENT_DATA_SHEET _original = (INSTRUMENT_DATA_SHEET)e.OriginalObject;
INSTRUMENT_DATA_SHEET_HISTORY _history = new INSTRUMENT_DATA_SHEET_HISTORY();

如何將所有_original的屬性值復制到_history 我已嘗試使用此問題的解決方案,但是它不適用於我。 它引發錯誤:

Property DATE has an incompatible type in E_and_I.INSTRUMENT_DATA_SHEET_HISTORY

我的猜測是,這是因為DATE列是表2中主鍵的一部分,而不是表1中的主鍵。正如我所說,兩個表之間的唯一區別是主鍵。 這里供您參考:

主鍵

我看到的問題是,您的“歷史記錄”類型的“日期”字段是DateTime而您的“原始”類型是DateTime? (與“歷史記錄”中的REV相同的問題,不能為null)。 如果原始版本中的DateTime為空,則必須決定會發生什么。 然后,您應該能夠修改Skeets代碼(哦,親愛的!),以與其他字段不同的方式專門處理這些字段。

好了,我設法弄清楚了:)這是我做的:

INSTRUMENT_DATA_SHEET _original = (INSTRUMENT_DATA_SHEET)e.OriginalObject;
INSTRUMENT_DATA_SHEET_HISTORY _history = new INSTRUMENT_DATA_SHEET_HISTORY();

foreach (PropertyInfo pi in _original.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
    _history.GetType().GetProperty(pi.Name).SetValue(_history, pi.GetValue(_original, null), null);
}

不是很優雅,但是可以完成工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM