1

テーブルをオブジェクトにマップすると、作成されるすべてのプロパティが 1 つの db 列に対応します。プロパティにマップされる前に列で db 関数を実行したいので、プロパティは列ではなく db 関数によって返された値を取得します

私は ColumnAttribute の Expression プロパティによってそれを達成しようとしていました (以下の例のように)、代わりにBirthDateusrFn_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 でデータベースを作成しない限り、意図したとおりに動作しません。

次のような 1 つのステートメントでさまざまな列を選択し、db 関数を呼び出す Linq クエリを作成できます (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)
          };

これは匿名型に投影されますが、非匿名型も使用できます。例として、FirstName、LastName、および BirthDate 列を持つ Person という名前のテーブルと、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 に答える