2011-02-17 5 views
0

엔지니어는 데이터베이스, 테이블, 필드를 선택하여 데이터베이스에 대해 간단한 단일 테이블/뷰 쿼리를 수행 할 수있는 응용 프로그램을 개발하고 있습니다.동적 LINQ를 사용하여 런타임에 테이블을 동적으로 선택하는 방법

동적 LINQ 라이브러리 예제를 사용하여 런타임에 Select, Where 및 Order by Clauses를 동적으로 선택하는 방법을 얻었지만 테이블 선택에 할당하는 방법에 대해서는 집중하지 못했습니다.

"실행"테이블에서 동적으로 테이블을 선택하는 방법이 있습니까? 그리고 어떻게하면 구체적인 예를 제공 할 수 있습니까?

고맙습니다.



편집

그래서 대답은 모두 동일한 일반 아이디어를 말하는 것 같다. 나는 C#을 VB로 변환하려고 노력할 것이다.

첫 번째 대답은

NotInheritable Class DataContextExtensions 
    Private Sub New() 
    End Sub 
    <System.Runtime.CompilerServices.Extension> _ 
    Public Shared Function GetTableByName(context As DataContext, tableName As String) As ITable 
     If context Is Nothing Then 
      Throw New ArgumentNullException("context") 
     End If 
     If tableName Is Nothing Then 
      Throw New ArgumentNullException("tableName") 
     End If 
     Return DirectCast(context.[GetType]().GetProperty(tableName).GetValue(context, Nothing), ITable) 
    End Function 
End Class 

로 변환하지만, 그 확장 방법 만 모듈에서 정의 할 수 없다는 나에게 오류를 던지는 것. 하지만 모듈 태그로 포장해도 동일한 오류가 발생합니다.

그래서 모듈 태그로 래핑하고 클래스 태그를 제거하여 컴파일해야합니다. 또한 나는 그것의 마지막 줄을 끌어낼 수 있고 내 기본 방법으로 그것을 직접 실행할 수 있습니다.하지만 그것을 다시 실행할 수 있습니다. 결과를 열거하려고 할 때 아무 것도 없습니다. 이것이 내 코드 문제인지 아니면 새로운 코드 문제인지 확실하지 않아서 더 테스트 할 것입니다.


다음은 두 번째 예제의 변환입니다. 이제는 작동시킬 수 있는지 알아보기 위해 노력하고 있습니다. 나는 약간 시험 후에 질문 또는 결과로 돌아올 것이다.

'get the table from a type (which corresponds to a table in your context) 
Dim dataContextNamespace = "My.DataContext.Namespace" 
Dim type = Type.[GetType](dataContextNamespace + tableName) 
Dim table = dc.GetTable(type 

'add where clauses from a list of them 
For Each whereClause As String In whereClauses 
    table = table.Where(whereClause) 
Next 

'generate the select clause from a list of columns 
Dim query = table.[Select]([String].Format("new({0})"), [String].Join(",", selectColumns)) 

도움 주셔서 감사합니다. BBL

답변

1

당신은 당신의 데이터의 해당 ITable를 얻을 수 GetTable()를 사용할 수 있습니다. 그런 다음 DLINQ을 사용하여 결합하면 비교적 쉽습니다.

이 예제에서는 AdventureWorks 데이터베이스를 사용합니다. 내 프로젝트는 DatabaseTest.AdventureWorks 네임 스페이스의 DatabaseTest 어셈블리에 정의 된 컨텍스트를가집니다.

돌이켜 보면, 이미 이름이 있기 때문에 리플렉션을 사용하면 테이블을 쉽게 얻을 수 있었을 것입니다. 그러나 그 이름들은 일대일 대응이 아니기 때문에이를 보상해야합니다.

Dim table As ITable = dc.GetType().GetProperty(tableName & "s").GetValue(dc, Nothing) 
+0

@ Jess M을 통해 작업하려하지만 var dataContextNamespace = "My.DataContext.Namespace"에 문제가 있습니다. 이제는 바꿀 수 있도록 내 네임 스페이스가 있어야합니다. 예를 들어, 내 테스트 테이블에 대한 datacontext는 FerrotecLINQ_SQLDataContext로 이름 붙여 넣어야합니까? – Neberu

+0

@Neberu : 원하는 테이블에 해당하는 Type 개체를 얻기 위해 LINQ to SQL 클래스 중 하나의 정규화 된 이름을 얻는 것이 요점입니다. 데이터 컨텍스트가있는 네임 스페이스 (있는 경우)와 해당되는 경우 어셈블리가 필요한 네임 스페이스가 필요합니다. –

2

Get table-data from table-name in LINQ DataContext을 참조하십시오.

실제로 이것은 직접적인 SQL 문을 사용하는 것이 좋습니다. LINQ가 방해가 될 것입니다.

VB 변환 :

NotInheritable Class DataContextExtensions 
    Private Sub New() 
    End Sub 
    <System.Runtime.CompilerServices.Extension> _ 
    Public Shared Function GetTableByName(context As DataContext, tableName As String) As ITable 
     If context Is Nothing Then 
      Throw New ArgumentNullException("context") 
     End If 
      If tableName Is Nothing Then 
       Throw New ArgumentNullException("tableName") 
      End If 
     Return DirectCast(context.[GetType]().GetProperty(tableName).GetValue(context, Nothing), ITable) 
    End Function 
End Class 

사용법 :

Dim myDataContext as New MyCustomDataContext 
myDataContext.GetTableByName("ORDERS").Where("...") 
+0

저는 이것을 구현하려고하는데 어떻게 확장 메소드를 호출합니까? VB에서 코드가 작동하도록하려면 모듈에 넣고 클래스 태그를 제거해야한다는 점에 유의해야합니다. – Neberu

+0

위의 변경 사항을 확인하십시오. 확장 메서드가 VB.Net에서 C#과 동일한 방식으로 작동하는지 확실하지 않습니다. – mellamokb