Linq to sql-从db函数获取值,而不是直接从db字段获取值(映射属性时)

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

将表映射到对象时,创建的每个属性都对应于一个db列。 我希望在列映射到属性之前对其执行db函数,以便属性获取db函数返回的值,而不是列返回的值

我试图通过ColumnAttribute的Expression属性实现这一点(如下面的示例所示),因此返回的不是
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;
        }