Как я могу использовать две разные базы данных с Linq to SQL в Linqpad?

Я начинаю с Linq To SQL, возился с Linqpad и пытаюсь дублировать сценарий SQL, который объединяется с таблицами в отдельных базах данных на том же сервере (SQL Server 2008).

Запрос TSQL выглядит примерно так:

using MainDatabase
go

insert Event_Type(code, description)

select distinct t1.code_id, t2.desc

from OtherDatabase..codes t1
     left join OtherDatabase..lookup t2 on t1.key_id = t2.key_id and t2.category = 'Action 7'

where t2.desc is not null

Я в основном пытаюсь понять, как выполнить вставку между базами данных. Возможно ли это с Linq To SQL (и возможно ли это в Linqpad?)


person Factor Mystic    schedule 23.06.2010    source источник


Ответы (2)


Это возможно в LINQ to SQL, если вы создаете (одинарный) типизированный DataContext, который содержит классы таблиц для объектов в обеих базах данных. Этот конструктор вам здесь не поможет, поэтому вам придется создать некоторые классы таблиц вручную. Другими словами, используйте конструктор VS для создания типизированного DataContext для вашей первичной базы данных, а затем вручную добавьте классы для таблиц в другой базе данных, к которой вы хотите получить доступ:

[Table (Name = "OtherDatabase.dbo.lookup")]
public class Lookup
{
  ...
}

Изменить: теперь в версии LINQPad Premium вы можете выполнять запросы между базами данных с помощью SQL Server одним из двух способов.

Самым простым является метод перетаскивания: удерживайте нажатой клавишу Ctrl при перетаскивании дополнительных баз данных из обозревателя схем в редактор запросов. Чтобы получить доступ к этим дополнительным базам данных в ваших запросах, используйте нотацию database.table, например, Northwind.Regions.Take (100). Запрашиваемые базы данных должны находиться на одном сервере.

Второй подход - перечислить дополнительные базы данных, которые вы хотите запросить, в диалоговом окне свойств соединения. В этом диалоговом окне также можно выбирать базы данных с связанных серверов. Вот как действовать:

  1. Добавьте новое соединение LINQ to SQL.
  2. Выберите «Указать новую или существующую базу данных» и выберите первичную базу данных, которую вы хотите запросить.
  3. Установите флажок Include Additional Databases и выберите дополнительные базы данных, которые вы хотите включить. Вы также можете выбрать базы данных со связанных серверов в этом диалоговом окне.

Теперь вы можете выполнять запросы между базами данных. Они оптимизированы должным образом, поскольку соединения будут происходить на сервере, а не на клиенте.

person Joe Albahari    schedule 25.06.2010
comment
Поэтому мне нужно было создать одну сборку, содержащую по одному классу DataContext для каждой таблицы. Эта сборка будет иметь эти классы DataContext для каждой базы данных, к которой мне нужно получить доступ. И этот процесс для создания этой сборки должен выполняться вручную. Фу. А как насчет того, когда в базах данных есть таблицы с одинаковыми именами? - person Factor Mystic; 25.06.2010
comment
Нет - сборка должна содержать ОДИН DataContext, содержащий таблицы, к которым вы хотите получить доступ из обеих баз данных. Если возникает конфликт имен, дайте одному из классов таблиц другое имя - это не имеет значения, если вы правильно применили атрибут Table. - person Joe Albahari; 26.06.2010

Используйте связанные серверы с полными именами для запроса другой базы данных из текущей БД. Это должно сработать.

using MainDatabase 
go 

insert Event_Type(code, description) 

select distinct t1.code_id, t2.desc 

from <Linked_Server>.OtherDatabase..codes t1 
     left join <Linked_Server>.OtherDatabase..lookup t2 on t1.key_id = t2.key_id and t2.category = 'Action 7' 

where t2.desc is not null 
person Baaju    schedule 23.06.2010
comment
Я не понимаю. Базы данных находятся на одном сервере. - person Factor Mystic; 23.06.2010