2012-03-07 22 views
1

SQLサーバー上でUDFを作成します。それをfnCompanyDetailsと名づけましょう。いくつかのジョイントテーブルから企業に関する情報を選択します。 それから、私のVBプロジェクトの新しい.dbmlにこの関数をドラッグ&ドロップします。私はLINQでそれを使用したい。このようなSmth:LINQ to SQLとユーザー定義関数によるSubmitChanges

Dim company = (From c In d.fnCompanyDetails(sap) 

        Select New With { 

     .Sap = c.txtSAP, 

     .CompanyName1 = c.txtCompanyName1, _ 

     .CompanyName2 = c.txtCompanyName2, _ 

     }) 

このクエリの結果は、ユーザーにフォームで表示されます。いくつかのフィールドが変更された場合、私のデータベースに変更を送信したいのですが、UDFからこのように見ているなら、これは可能でしょうか? ありがとう

答えて

1

いいえ、残念ながら簡単な方法で行うことはできません。 Linq-to-SQLは、をカスタムタイプに対してと読むことをサポートしていますが、テーブルに正確に対応するエンティティタイプによる更新のみをサポートしています。

通常、最も良い方法は、純粋なエンティティオブジェクトを更新する意図で読み取られている場合、常に読み取ることです。

もう1つの解決策は、udfから返されたデータからエンティティオブジェクトを作成し、そのエンティティをコンテキストに付加することです。最初にエンティティを元の状態に設定してからの後にを変更すると、変更のトラッキングに関する問題がなくなります。

+0

ありがとう、アンダース!これらのエンティティオブジェクトでは、テーブルに変更をアップロードするためにこのオブジェクトがデータベーステーブルの構造を繰り返す必要があることを意味しますか?そして、私はすべてのデータベースロジック(すべてのUDF、SP、ビューなど)をSQLサーバーに持たせたい場合(コード内でLINQを使用してそれらを構築しないことを意味します)、データセットを使用する方が良いでしょう。 LINQに行くよりも? – kzub

+1

デザイナーの表面にテーブルをドラッグすると、エンティティオブジェクトが自動的に作成されます。 linq-to-sqlの目的は、ビジネスロジックをすべて(ほぼ)コードに配置することです。 UDFまたはSPを使用している場合は、他にも優れたオプションが存在する可能性があります。 –

+0

このケースでは、LINQの概念全体をよく理解していません。(テーブル全体を選択しなければならない場合は、生成されたクラスにマップし、そこから更新して挿入する必要があります。 エンティティオブジェクト "tblCompany"をUDFから返された結果から取得しましたが、 "エンティティタイプ 'tblCompany'の明示的な構築はクエリで許可されていません"というエラーが発生しました。クラシックなADO.Netでうまくいく – kzub

関連する問題