2012-05-21 2 views
0

프리미엄 버전의 LINQPad를 구입했습니다. DevForce 모델로 교차 데이터베이스 쿼리를 수행하는 것도 가능할 것이라고 생각했습니다.여러 데이터 인터페이스를 사용하는 LinqPad - DevForce

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

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

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

Source

그러나 분명 어떤 방법이있다,이없는 ? 누구든지 이것에 대한 해결책?

답변

2

데이터베이스 간 쿼리는 표준 SQL Server 연결, 동일한 서버 또는 연결된 서버의 데이터베이스에서만 작동합니다. 주된 이유는 서버 쪽 가입을 보장하는 것입니다. 그렇지 않으면 가입 할 때마다 전체 테이블을 클라이언트로 다시 가져옵니다.

LINQPad에 임의의 데이터베이스 간 쿼리를 허용하는 기능을 추가하는 것을 고려했습니다. 클라이언트 쪽 조인을 사용하는 경우에도 유용 할 수 있기 때문에 유용합니다. 그러나 DevForce 또는 Entity Framework와 같은 사용자 정의 데이터 컨텍스트에서이 작업을 수행하는 것은 매우 까다로운 것으로 판명되었으므로 기능이 "지나치게 까다로운"바구니로 끝납니다. 주요한 문제는 namespace/assembly/app.config 충돌을 다루는 것이 었습니다.

F4 키를 누르고 추가 데이터 인터페이스를 포함하는 어셈블리에 대한 참조를 추가하는 것을 막을 수는 없습니다. 물론 두 번째 데이터 컨텍스트를 수동으로 인스턴스화해야하지만 큰 문제는 아닙니다. 자동 완성 기능을 사용할 수 있으며 별도의 연결을 만들면 트리보기에서 스키마를 볼 수 있습니다. LINQPad가 다중 연결 쿼리를 지원한다면 기능적으로는 결국 어쨌든 끝날 것입니다.

은 무엇 SQL Server에 대한 지원을 조회 LINQPad의 데이터베이스 간 특별한 것은이 서버를 활용하여 효율적인 데이터베이스 간 쿼리를 허용하는 다른 어셈블리에 대한 참조를 추가하여 달리 간단하게 할 수없는 무언가를한다는 것입니다 - 사이드 조인.

+0

고마워요. 그게 분명 도움이 될거야. –

1

SQL 인스턴스를 다르게하고 의사 교차 데이터베이스 조인, 데이터 복사 등을 실행할 수있는 컨텍스트를 인스턴스로 만들 수 있습니다. 컨텍스트간에 조인은 로컬에서 수행되므로 ToList(), ToArray() 등을 호출해야합니다. 결합하기 전에 각각의 데이터 소스를 사용하여 u 리를 개별적으로 실행합니다.즉, DB2 TABLE2의 20 행을 가진 DB1.TABLE1에서 10 개의 행을 "내부"로 조인하면 Linq가 조인을 수행하고 관련/교차하는 결과를 반환하기 전에 두 세트 (모두 30 행)를 로컬 시스템의 메모리로 가져와야합니다. 세트 (최대 20 개 행당 최대 행 수)

//EF6 context not selected in Linqpad Connection dropdown 
var remoteContext = new YourContext(); 
remoteContext.Database.Connection.ConnectionString = "Server=[SERVER];Database=" 
+ "[DATABASE];Trusted_Connection=false;User ID=[SQLAUTHUSERID];Password=" 
+ "[SQLAUTHPASSWORD];Encrypt=True;"; 
remoteContext.Database.Connection.Open(); 
var DB1 = new Repository(remoteContext); 

//EF6 connection to remote database 
var remote = DB1.GetAll<Table1>() 
    .Where(x=>x.Id==123) 
    //note...depending on the default Linqpad connection you may get 
    //"EntityWrapperWithoutRelationships" results for 
    //results that include a complex type. you can use a Select() projection 
    //to specify only simple type columns 
    .Select(x=>new { x.Col1, x.Col1, etc... }) 
    .Take(1) 
    .ToList().Dump(); // you must execute query by calling ToList(), ToArray(), 
       // etc before joining 


//Linq-to-SQL default connection selected in Linqpad Connection dropdown 
Table2.Where(x=>x.Id = 123) 
    .ToList() // you must execute query by calling ToList(), ToArray(), 
       // etc before joining 
    .Join(remote, a=> a.d, b=> (short?)b.Id, (a,b)=>new{b.Col1, b.Col2, a.Col1}) 
    .Dump(); 

localContext.Database.Connection.Close(); 
localContext = null;