2009-12-03 5 views
1

고객이 사용자 지정 테이블을 만들고 가져올 수있는 응용 프로그램과 함께 작업하고 있습니다. 이러한 고객이 가져온 사용자 지정 테이블에 대해 동적 쿼리를 작성하도록 허용해야하며 LINQ를 사용하여이 작업을 수행 할 수 있기를 원합니다.매핑되지 않은 테이블에 동적 LINQ2SQL

저는 동적 LINQ 쿼리를 만드는 방법에 익숙하지만 모든 알고있는 메서드는 DataContext 개체의 기존 매핑 된 개체를 필요로합니다. 사용자가 런타임에 (동적 문자열 내장 SQL을 통해) 사용자 정의 테이블을 만들 수 있기 때문에 모든 DataContext에 매핑 된 객체가 없습니다.

동적 Linq 쿼리와 함께 사용하기 위해 런타임에 DataContext와 매핑 된 객체를 동적으로 만드는 방법이 있습니까?

문자열 내장 SQL을 사용하지 않고이 작업을 수행 할 수있는 다른 방법이 있습니까?

+0

리플렉션 방출 호출을 사용하여 유형을 동적으로 빌드하고 아음속 IQueryable 엔진을 사용하여 수행되었습니다. – Firestrand

답변

0

Linq to SQL 데이터 클래스를 만들 때 사용할 수있는 T4 템플릿이 있습니다. 아마도 당신은 그것들을 적응시킬 수 있습니다.

http://www.pnpguidance.net/Post/LINQToSQLCodeGenerationT4TemplatesTutorials.aspx

은 Microsoft C# 컴파일러 또는 Visual Studio 필요없이 어셈블리를 생성하는 내가 생각할 수있는 두 가지 방법이 있습니다. 첫 번째는 System.Reflection.Emit을 사용하여 사용자 지정 어셈블리를 생성하는 것입니다. 이것은 소리보다 쉬울 수도 있습니다; 즉를

ReflectionEmitLanguage은 반사경 어떤 추가 기능이 수행하는 기존 IL 어셈블리를 가지고있다
http://reflectoraddins.codeplex.com/wikipage?title=ReflectionEmitLanguage&referringTitle=Home

에 대한-에 추가하고 C# 코드를 만들 때 : 추가 기능 반사판을 위해 다음에 봐 System.Reflection.Emit은 C# 컴파일러와 동일한 IL을 생성하는 데 걸리는 호출입니다. 그래서 본질적으로 당신은 프로토 타입 DataContext을 포함하는 어셈블리를 만들고이 메서드에서이 작업을 실행합니다. 그런 다음 일리노이 어셈블리를 직접 생성하는 클래스 (또는 그 중 더 나은 부분)를 갖게됩니다. 이 코드는 모두 오픈 소스입니다.

당신이 할 수있는 다른 일은 일리노이 어셈블리를 생성하기 위해 Mono C# compiler (Microsoft C# 컴파일러와 달리 서비스처럼 호출 될 수 있음)을 사용해보십시오. C# 컴파일러는 오픈 소스이기도합니다.

+0

그것은 흥미로운 아이디어입니다. 나는 여전히 Visual Studio가 T4 템플릿에 대해 구문 분석하고 생성해야한다고 믿습니다. 비슷한 결과를 얻으려면 CodeSmith와 같은 다른 코드 생성기를 사용할 수도 있지만 두 가지 모두 알고 있다면 DataContext에 클래스를 연결하는 데 컴파일이 필요합니다. – Firestrand

+0

@Firestrand, 제 편집 참조. –

+0

그래서 지금까지의 대답은 Linq에 대한 클래스와 데이터 컨텍스트를 만들기 위해 어떤 유형의 동적 컴파일이 발생해야한다는 것입니다. 동적 컴파일을위한 몇 가지 리소스가 있습니다. 나는 그 방향으로 일할 것이다. – Firestrand

관련 문제