我正在使用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