엔지니어는 데이터베이스, 테이블, 필드를 선택하여 데이터베이스에 대해 간단한 단일 테이블/뷰 쿼리를 수행 할 수있는 응용 프로그램을 개발하고 있습니다.동적 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
@ Jess M을 통해 작업하려하지만 var dataContextNamespace = "My.DataContext.Namespace"에 문제가 있습니다. 이제는 바꿀 수 있도록 내 네임 스페이스가 있어야합니다. 예를 들어, 내 테스트 테이블에 대한 datacontext는 FerrotecLINQ_SQLDataContext로 이름 붙여 넣어야합니까? – Neberu
@Neberu : 원하는 테이블에 해당하는 Type 개체를 얻기 위해 LINQ to SQL 클래스 중 하나의 정규화 된 이름을 얻는 것이 요점입니다. 데이터 컨텍스트가있는 네임 스페이스 (있는 경우)와 해당되는 경우 어셈블리가 필요한 네임 스페이스가 필요합니다. –