LINQを介して結合する必要がある2つのテーブルがありますが、それらは異なるデータベースに存在します。今、私は一方のテーブルの結果を返し、次にループしてもう一方のテーブルの結果を取得していますが、これはご想像のとおり、それほど効率的ではありません。それらを単一のLINQステートメントにまとめる方法はありますか?ループを回避するためにこれを構築する他の方法はありますか?何かを見落としている場合に備えて、私はただアイデアを探しています。
データベースを変更できないことに注意してください。つまり、一方に他方を参照するビューを作成することはできません。私がまだ試したことのないことは、両方のテーブルを参照する3番目のデータベースにビューを作成することです。どんなアイデアでも大歓迎です。
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の接続文字列で使用されているものと同じである必要があります。
データベースにproc/viewを作成します。
あなたの条件を考えると、1つのLinqステートメントでこれを行うことはできないと思います。ただし、L2Sクエリの結果をLinq toObjectsクエリに結合することはできます。