Linq to sql-从db函数获取值,而不是直接从db字段获取值(映射属性时)
将表映射到对象时,创建的每个属性都对应于一个db列。 我希望在列映射到属性之前对其执行db函数,以便属性获取db函数返回的值,而不是列返回的值 我试图通过ColumnAttribute的Expression属性实现这一点(如下面的示例所示),因此返回的不是Linq to sql-从db函数获取值,而不是直接从db字段获取值(映射属性时),sql,linq,orm,Sql,Linq,Orm,将表映射到对象时,创建的每个属性都对应于一个db列。 我希望在列映射到属性之前对其执行db函数,以便属性获取db函数返回的值,而不是列返回的值 我试图通过ColumnAttribute的Expression属性实现这一点(如下面的示例所示),因此返回的不是BirthDate,而是usrFn\u UTCToLocalTime(BirthDate) 但它似乎不起作用,仍然得到列的纯值 [global::System.Data.Linq.Mapping.ColumnAttribute(Storage
BirthDate
,而是usrFn\u 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;
}
}
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage=“\u BirthDate”,DbType=“DateTime”,UpdateCheck=UpdateCheck.Never,Expression=“dbo.usrFn\u UTCToLocalTime(BirthDate)”)]
公共系统。可为空的生日
{
得到
{
把这个还给我。_生日;
}
}
我还修改了DBML XML,如中所示:
但也没有结果
使用LINQ是可能的,还是我必须覆盖一个需要往返服务器的getter?根据MSDN页面上的备注部分,在调用CreateDatabase时使用ColumnAttribute的Expression属性,因此除非您使用LINQ to Sql创建数据库,否则它不会按照您的预期方式工作 您可以创建一个Linq查询,该查询选择不同的列,并在一条语句中调用db函数,如下所示(基于MSDN): 这会投影到匿名类型,但也可以使用非匿名类型。在本例中,我得到了一个名为Person的表,其中包含FirstName、LastName和BirthDate列,以及一个名为usrFn\u UTCToLocalTime的用户定义标量函数。发送到服务器的sql语句是:
SELECT [t0].[FirstName], [t0].[LastName], [t0].[BirthDate], CONVERT(DateTime,[dbo].[usrFn_UTCToLocalTime]([t0].[BirthDate])) AS [Dob]
FROM [dbo].[Person] AS [t0]
正如我在问题中所建议的,现在我已经覆盖了get方法,所以我有:
get
{
using (var context = DB.Data.DataContextFactory.CreateContext())
{
return context.usrFn_UTCToLocalTime(_BirthDate);
}
//return this._BirthDate;
}
但是,每次进入该地产,都会进行往返——这不是我的意图,但会给出一个适当的结果。
我把问题留着谢谢你的回答。但这不是我的目标。问题是,要使用LINQ对象的每个人都必须透明地获得适当的值,而不知道必须使用db函数。在每次访问对象时显式调用此函数容易出错,并且可能会被忘记。正如我在问题中所建议的那样,我宁愿覆盖getter(但我希望避免往返到服务器)
get
{
using (var context = DB.Data.DataContextFactory.CreateContext())
{
return context.usrFn_UTCToLocalTime(_BirthDate);
}
//return this._BirthDate;
}