1

当您将表映射到对象时,创建的每个属性都对应一个 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,如下所示: stackoverflow 上的其他帖子, 但也没有结果。

这是否可能通过使用 LINQ 或者我必须覆盖一个花费往返服务器的吸气剂?

4

2 回答 2

0

正如我在问题中所建议的那样,现在我已经覆盖了 get 方法,所以我有:

get
        {
            using (var context = DB.Data.DataContextFactory.CreateContext())
            {
                return context.usrFn_UTCToLocalTime(_BirthDate);
            }

            //return this._BirthDate;
        }

但是每次访问该属性时,都会进行往返 - 这不是我的意图,但会给出正确的结果。我的问题仍然悬而未决

于 2012-10-25T10:51:49.517 回答
0

根据MSDN 页面上的备注部分,调用 CreateDatabase 时会使用 ColumnAttribute 的 Expression 属性,因此除非您使用 Linq to Sql 创建数据库,否则它不会按您想要的方式工作。

您可以创建一个 Linq 查询来选择各种列并在这样的一个语句中调用 db 函数(基于 MSDN示例):

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]
于 2012-10-25T08:35:46.977 回答