Подтвердить что ты не робот

LINQ для нескольких баз данных

У меня есть две таблицы, которые нужно подключить через LINQ, но они живут в разных базах данных. Сейчас я возвращаю результаты одной таблицы, затем перебираю и получаю результаты другой, что, как вы можете догадаться, не очень эффективно. Есть ли способ получить их в один оператор LINQ? Есть ли другой способ построить это, чтобы избежать цикла? Я просто ищу идеи, на случай, если я что-то пропущу.

Обратите внимание, что я не могу изменить базы данных, т.е. я не могу создать представление в одном, которое ссылается на другое. Что-то, чего я еще не пробовал, это создание представлений в третьей базе данных, которая ссылается на обе таблицы. Любые идеи приветствуются.

4b9b3361

Ответ 1

Вы можете сделать это, даже на серверах, до тех пор, пока вы можете получить доступ к одной базе данных из другой. То есть, если можно написать инструкцию SQL ServerA.DatabaseA, которая обращается к ServerB.DatabaseB.schema.TableWhatever, то вы можете сделать то же самое в LINQ.

Чтобы сделать это, вам нужно вручную отредактировать файл .dbml. Вы можете сделать это в VS 2008 легко следующим образом: щелкните правой кнопкой мыши, выберите Открыть с... и выберите XML-редактор.

Посмотрите на элемент Связь, который должен находиться в верхней части файла. Что вам нужно сделать, это предоставить явное имя базы данных (и имя сервера, если оно отличается) для таблиц, не указанных в базе данных, на которые указывает эта строка соединения.

Исходный тег для элемента Таблица в вашем .dbml выглядит следующим образом:

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

Что вам нужно сделать, для любой таблицы, не содержащей в базе данных строки подключения, изменить атрибут Имя на что-то вроде этого:

<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

Если это не работает, убедитесь, что у вас есть пользователь или логин с доступом к обоим базам данных с тем же паролем. Разумеется, он должен быть таким же, как тот, который используется в вашей строке подключения .dbml.

Ответ 2

Создайте proc/view в вашей базе данных.

Ответ 3

Учитывая ваши условия, я не думаю, что вы можете сделать это в одном заявлении Linq. Но вы можете присоединить результаты ваших запросов L2S к запросу Linq to Objects.