我正在使用shim屬性來確保日期始終是UTC。這本身很簡單,但現在我想查詢數據。我不想公開底層屬性,而是希望查詢使用SHIM屬性。我遇到的麻煩是映射墊片屬性。例如:LINQ to SQL中的別名屬性
public partial class Activity
{
public DateTime Started
{
// Started_ is defined in the DBML file
get{ return Started_.ToUniversalTime(); }
set{ Started_ = value.ToUniversalTime(); }
}
}
var activities = from a in Repository.Of<Activity>()
where a.Started > DateTime.UtcNow.AddHours(- 3)
select a;
試圖在一個例外,執行查詢的結果:
System.NotSupportedException: The member 'Activity.Started' has no supported
translation to SQL.
這是有道理的 - LINQ到SQL怎麼會知道如何對待入門屬性 - 它不是一個列或協會?但是,我正在尋找像ColumnAliasAttribute這樣的東西,它告訴SQL將Started的屬性視爲Started_(帶下劃線)。
有沒有一種方法可以幫助LINQ to SQL將表達式樹轉換爲Started屬性可以像Started_屬性一樣使用?
這幾乎可行。問題在於它需要.WithTranslations處理LINQ語句 - 即使使用...自動語句。在這一點上,它只是直接引用Started_屬性。我真的很希望這個屬性能夠被調用代碼透明化。 – 2009-09-10 02:39:43
如果數據庫結構沒有被鎖定(即屬於別人或某個無法更改的應用程序),我建議去選項#2 - 在數據庫中存儲爲UTC,或者存儲爲本地+偏移量在計算列中計算UTC。這有額外的好處,保護你從一個不同的時區比您所在的時區在當地時間做ToUniversalTime ... – KristoferA 2009-09-10 02:45:00