web-dev-qa-db-ja.com

複数のデータベースにわたるLINQ

LINQを介して結合する必要がある2つのテーブルがありますが、それらは異なるデータベースに存在します。今、私は一方のテーブルの結果を返し、次にループしてもう一方のテーブルの結果を取得していますが、これはご想像のとおり、それほど効率的ではありません。それらを単一のLINQステートメントにまとめる方法はありますか?ループを回避するためにこれを構築する他の方法はありますか?何かを見落としている場合に備えて、私はただアイデアを探しています。

データベースを変更できないことに注意してください。つまり、一方に他方を参照するビューを作成することはできません。私がまだ試したことのないことは、両方のテーブルを参照する3番目のデータベースにビューを作成することです。どんなアイデアでも大歓迎です。

36
gfrizzle

canこれは、サーバー間でも、一方のデータベースから他方のデータベースにアクセスできる限り、実行できます。つまり、ServerA . DatabaseAに対してSQLステートメントを記述できる場合はServerB .DatabaseB.schema.TableWhateverの場合、LINQでも同じことができます。

これを行うには、.dbmlファイルを手動で編集する必要があります。 VS 2008では、次のように簡単にこれを行うことができます。右クリックしてOpen With ...を選択し、XML Editorを選択します。

Connection要素を見てください。これはファイルの先頭にあるはずです。あなたがする必要があるのは、その接続文字列が指すデータベースにないテーブルの明示的なデータベース名(および異なる場合はサーバー名)を提供することです。

.dbmlのTable要素の開始タグは次のようになります。

<Table Name="dbo.Customers" Member="Customers">

あなたがする必要があるのは、接続文字列のデータベース内のテーブルnotについて、そのName属性を次のようなものに変更することです。

<Table Name="SomeOtherDatabase.dbo.Customers" Member="Customers">
<Table Name="SomeOtherServer.SomeOtherDatabase.dbo.Customers" Member="Customers">

問題が発生した場合は、元のデータベース(またはサーバー)から他のデータベース(またはサーバー)に実際にアクセスできることを確認してください。 SQL Server Management Studioで、元のデータベースに対して実行される、次のような小さなSQLステートメントを記述してみてください。

SELECT SomeColumn
FROM OtherServer.OtherDatabase.dbo.SomeTable

thatが機能しない場合は、同じパスワードで両方のデータベースにアクセスできるユーザーまたはログインがあることを確認してください。もちろん、.dbmlの接続文字列で使用されているものと同じである必要があります。

40
Ryan Lundy

データベースにproc/viewを作成します。

6
user32415

あなたの条件を考えると、1つのLinqステートメントでこれを行うことはできないと思います。ただし、L2Sクエリの結果をLinq toObjectsクエリに結合することはできます。

0
TGnat