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

时间:2012-10-24 12:34:44

标签: sql linq orm

将表映射到对象时,创建的每个属性都对应一个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?

2 个答案:

答案 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;
        }

但随着每次进入该物业,都会进行往返 - 这不是我的意图,而是给出了正确的结果。 我让问题仍然悬而未决