2012-01-06 4 views
2

ためのSQLを構成しません。以下の表:LinqToSql DataContextのは、私はセットアップに以下を確認するためのテスト・データベースおよびコンソールアプリを持っている機能

CREATE TABLE [dbo].[Test](
    [PKey] [int] IDENTITY(1,1) NOT NULL, 
    [WFT] [uniqueidentifier] NULL, 
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED 
(
    [PKey] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

スカラー値関数ufn_GTFOは、通常、構成可能であるように、次のC#:

static void InterfaceTest() 
{ 
    IDataClasses1DataContext db = new DataClasses1DataContext(); 
    var q = from t in db.Tests 
      select new { t.PKey, GTFO = db.ufn_GTFO(t.WFT) }; 

    var p = q.ToArray(); 
} 

I:DataContextの上>エキスインターフェイス、およびそのインスタンスを使用する - 私はリファクタリングを使用している場合、

SELECT [t0].[PKey], [dbo].[ufn_GTFO]([t0].[WFT]) AS [GTFO] FROM [dbo].[Test] AS [t0] 

しかし:

static void ConcreteTest() 
{ 
    DataClasses1DataContext db = new DataClasses1DataContext(); 
    var q = from t in db.Tests 
      select new { t.PKey, GTFO = db.ufn_GTFO(t.WFT) }; 

    var p = q.ToArray(); 
} 
は、以下のSQLに変換され、次のSQLを取得し、ufn_GTFOの呼び出しは各レコードに対して1回発生します.ToArray()は結果を列挙します。

SELECT [t0].[PKey], [t0].[WFT] AS [guid] 
FROM [dbo].[Test] AS [t0] 

だから、私の質問は、なぜこれが起こらず、私はまだインターフェイスを使用している間、それを防ぐために何ができるのでしょうか?

アップデート1:私はILは、インターフェイスメソッドに対する具体的な方法のために発生した、と彼らはいずれかを持っていないようだインタフェースとコンパイラ生成した表示クラスへの参照のみが異なる比較しました結果に左右されます。

+0

私はLINQの観点から分からないように私は、これに対する答えを投稿しないだろうが、私はそのSQLを知っていますかサーバは、最初のクエリで 'ufn_GTFO'をすべての行に対して一度だけ実行します。 – Eric

+0

@eric - 正しいですが、ローカルで実行していますか行ごとに別の呼び出しを行うことは、パフォーマンスの観点とは大きく異なります。 –

答えて

1

linq to sqlは、クラス(datacontext)メンバーをデータベースメンバーにマップするために属性に大きく依存しています。あなたのインターフェイスは、おそらくufn_GRFOメソッドに対してFunctionAttributeを持っていません。その属性がなければ、C#の世界とSQL関数との間のリンクが切断されます。しかしながら。その属性はクラスでのみ有効で、インターフェイスではないので、あなたのインタフェースもDatabaseAttributeで修飾されていません。その属性がなければ、C#とデータベース全体の間のリンクが切断されています。デフォルトでLinqはAttributeMappingSourceを使用して、DataContextの型メンバーをマップします。インタフェースが問題のタイプであることを認識し、そのタイプがそのデータベースへのリンクを切断しました。データベース属性を適用できないため、デフォルトのマッピングソースは関数ufn_GRFOをデータベース関数にマップしません。むしろlinqはWFTフィールドからのデータを呼び出す.NET関数として扱います。

この問題の回避策は、カスタムMappingSource実装でdatacontextを提供することであり、DatabaseAttributeを無視してプロパティの属性のみを考慮することです。

http://msdn.microsoft.com/en-us/library/system.data.linq.mapping.functionattribute.aspx

http://msdn.microsoft.com/en-us/library/system.data.linq.mapping.databaseattribute.aspx

http://msdn.microsoft.com/en-us/library/system.data.linq.mapping.attributemappingsource.aspx

http://msdn.microsoft.com/en-us/library/system.data.linq.mapping.mappingsource.aspx

関連する問題