LINQ для нескольких баз данных
У меня есть две таблицы, которые нужно объединить через LINQ, но они находятся в разных базах данных. Прямо сейчас я возвращаю результаты одной таблицы, затем перебираю и извлекаю результаты другой, что, как вы можете догадаться, не очень эффективно. Есть ли способ получить их в одном операторе LINQ? Есть ли другой способ построить это, чтобы избежать зацикливания? Я просто ищу идеи на случай, если что-то упущу.
Обратите внимание, что я не могу изменить базы данных, т.е. я не могу создать представление в одном, которое ссылается на другое. Я еще не пробовал создавать представления в третьей базе данных, которая ссылается на обе таблицы. Любые идеи приветствуются.
3 ответа
Вы можете делать это даже на разных серверах, если вы можете получить доступ к одной базе данных с другой. То есть, если возможно написать оператор SQL для ServerA. База данных A, которая обращается к ServerB. База данных B. схема Таблица Что бы то ни было, тогда вы можете сделать то же самое в LINQ.
Для этого вам нужно отредактировать файл.dbml вручную. Вы можете легко сделать это в VS 2008 следующим образом: щелкните правой кнопкой мыши, выберите " Открыть с помощью..." и выберите " Редактор XML".
Посмотрите на элемент Connection, который должен находиться вверху файла. Вам нужно предоставить явное имя базы данных (и имя сервера, если оно отличается) для таблиц, не входящих в базу данных, на которые указывает эта строка подключения.
Открывающий тег для элемента Table в вашем.dbml выглядит следующим образом:
<Table Name="dbo.Customers" Member="Customers">
Что нужно сделать, для любой таблицы, отсутствующей в базе данных строки соединения, изменить атрибут 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
Если это не сработает, убедитесь, что у вас есть пользователь или логин с доступом к обеим базам данных с одним и тем же паролем. Конечно, он должен совпадать с тем, который используется в строке подключения вашего.dbml.
Учитывая ваши условия, я не думаю, что вы можете сделать это в одном заявлении Linq. Но вы можете объединить результаты ваших запросов L2S в запрос Linq to Objects.