将表映射到对象时,创建的每个属性都对应一个db列。 我想在列映射到属性之前对列执行db函数,因此该属性获取db函数返回的值,而不是列
我试图通过ColumnAttribute的Expression属性实现(如下例所示),因此返回 BirthDate
而不是usrFn_UTCToLocalTime(BirthDate)
但它似乎没有工作,仍然得到了专栏的纯粹价值。
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "_BirthDate", DbType = "DateTime", UpdateCheck = UpdateCheck.Never, Expression = "dbo.usrFn_UTCToLocalTime(BirthDate)")]
public System.Nullable<System.DateTime> BirthDate
{
get
{
return this._BirthDate;
}
}
我还修改了DBML XML,如下所示: other post on stackoverflow 但也没有结果。
使用LINQ是否可以实现这一点,还是必须覆盖费用往返于服务器的getter?
答案 0 :(得分:0)
根据this MSDN页面上的备注部分,在调用CreateDatabase时使用ColumnAttribute的Expression属性,因此除非您使用Linq to Sql创建数据库,否则它将无法按您的方式工作。 / p>
您可以创建一个Linq查询来选择各个列并在一个语句中调用db函数(基于MSDN example):
var qry = from person in db.Persons
select new {
FirstName = person.FirstName,
LastName = person.LastName,
BirthDate = person.BirthDate,
Dob = db.usrFn_UTCToLocalTime(person.BirthDate)
};
这会投射到匿名类型,但您也可以使用非匿名类型。为了示例,我有一个名为Person的表,其中包含FirstName,LastName和BirthDate列,以及一个名为usrFn_UTCToLocalTime的用户定义标量函数。发送到服务器的sql语句是:
SELECT [t0].[FirstName], [t0].[LastName], [t0].[BirthDate], CONVERT(DateTime,[dbo].[usrFn_UTCToLocalTime]([t0].[BirthDate])) AS [Dob]
FROM [dbo].[Person] AS [t0]
答案 1 :(得分:0)
正如我在问题中的建议,现在我已经覆盖了get方法,所以我有:
get
{
using (var context = DB.Data.DataContextFactory.CreateContext())
{
return context.usrFn_UTCToLocalTime(_BirthDate);
}
//return this._BirthDate;
}
但随着每次进入该物业,都会进行往返 - 这不是我的意图,而是给出了正确的结果。 我让问题仍然悬而未决