2010-06-23 2 views
1

저는 Linq To SQL에서 Linqpad를 둘러 보면서 같은 서버 (SQL Server 2008)의 개별 데이터베이스에있는 테이블에 조인하는 SQL 스크립트를 복제하려고합니다.어떻게 Linq와 Linq에서 SQL에 두 개의 다른 데이터베이스를 사용할 수 있습니까?

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에서도 가능합니까?)

답변

0

현재 데이터베이스에서 다른 데이터베이스를 쿼리하려면 연결된 서버를 정규화 된 이름으로 사용하십시오. 그게 효과가있다.

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 
+0

나는 이해할 수 없다. 데이터베이스가 동일한 서버에 있습니다. –

+0

오, 이런! 네, 그 일이 너무 수줍음! – Baaju

+1

이것은 SQL 구문이지만, 어떻게 Linq에서 할 수있는 질문입니다 ... –

1

두 데이터베이스의 개체에 대한 테이블 클래스가 포함 된 (단일) 형식화 된 DataContext를 만드는 경우 LINQ to SQL에서 가능합니다. 이 디자이너는 여기서는 도움이되지 않으므로 수동으로 테이블 클래스를 만들어야합니다. 즉, 수동으로 액세스하려는 다른 데이터베이스의 테이블을위한 클래스를 추가, 기본 데이터베이스의 입력의 DataContext를 만들 VS 디자이너를 사용

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

편집 : LINQPad 프리미엄 에디션에서 이제 SQL Server를 사용하여 두 가지 방법 중 하나를 사용하여 데이터베이스 간 쿼리를 수행 할 수 있습니다.

가장 간단한 방법은 끌어서 놓기 방식입니다. Ctrl 키를 누른 상태에서 스키마 탐색기에서 쿼리 편집기로 추가 데이터베이스를 끌어옵니다. 쿼리에서 추가 데이터베이스에 액세스하려면 database.table 표기법 (예 : Northwind.Regions.Take (100))을 사용하십시오. 쿼리하는 데이터베이스는 동일한 서버에 있어야합니다.

두 번째 방법은 연결 속성 대화 상자에서 쿼리 할 추가 데이터베이스를 나열하는 것입니다. 이 대화 상자에서는 연결된 서버의 데이터베이스를 선택할 수 있습니다. 진행 방법은 다음과 같습니다.

  1. 새 LINQ to SQL 연결을 추가하십시오.
  2. 새 데이터베이스 지정 또는 기존 데이터베이스 지정을 선택하고 쿼리 할 기본 데이터베이스를 선택하십시오.
  3. Include Additional Databases 확인란을 클릭하고 포함 할 추가 데이터베이스를 선택하십시오. 이 대화 상자에서 연결된 서버의 데이터베이스를 선택할 수도 있습니다.

이제 데이터베이스 간 쿼리를 수행 할 수 있습니다. 이들은 조인이 클라이언트가 아닌 서버에서 발생하는 한 올바르게 최적화됩니다.

+0

그래서 각 테이블에 대해 하나의 DataContext 클래스를 포함하는 단일 어셈블리를 만들어야합니다. 이 어셈블리에는 액세스해야하는 각 데이터베이스에 대해 이러한 DataContext 클래스가 있습니다. 그리고이 어셈블리를 생성하는이 프로세스는 수동으로 수행해야합니다. 응. 데이터베이스의 이름이 같은 테이블의 경우는 어떻습니까? –

+0

아니요 - 어셈블리에는 두 데이터베이스에서 액세스하려는 테이블이 포함 된 단일 DataContext가 있어야합니다. 이름 충돌이 발생하면 테이블 클래스 중 하나에 다른 이름을 지정하십시오. 이는 테이블 속성을 올바르게 적용한 한 중요하지 않습니다. –

+1

이 답변은 이제 구식입니다 : http : // stackoverflow.co.kr/a/4928921/456188 – Crisfole

관련 문제