2012-07-11 2 views
0

SQL 쿼리에 하나의 linq를 작성하고 사용자가 제공 한 입력 문자열을 기반으로 런타임에 선택할 테이블을 동적으로 선택하려고합니다. 지금은이 작업을 수행하는 선택 문이 있지만 동일한 쿼리를 세 번 반복합니다. 단, 선택한 테이블 만 다를 수 있습니다. 이런 식으로 :Linq to SQL : 런타임에 테이블을 동적으로 선택하십시오.

if (input == "94") 
{ 
    var query = from i in db.Table94 
     select new MyClass(i.A, i.B, i.C); 
} 

if (input == "95") 
{ 
    var query = from i in db.Table95 
     select new MyClass(i.A, i.B, i.C); 
} 

//more conditional queries 

query = query.Where(addtionalFilteringDoneHere); 
DataGridView.DataSource = query; 

조건부 Where 절을 사용하기에 충분하지만 테이블 선택과 비슷한 것을 찾고 있습니다. 나는 두 가지 일에 지쳤으나 일하지 않았다. 예 :

var query = from i in FetchTable(input) 
    select new MyClass(i.A, i.B, i.C); 

query = query.Where(addtionalFilteringDoneHere); 

public returnType FetchTable(string input) 
{ 
    //need help here 
    return db.GetTable<conditionalTable>; 
} 

반환 유형이 무엇인지, 또는이를 수행 할 방법이 있는지 알 수 없습니다. 가능한가?

+0

이 중 중복 된 항목은 무엇입니까? http://stackoverflow.com/questions/1919632/get-table-data-from-table-name-in-linq-datacontext –

+0

이 예는 다소 오해의 소지가 있습니다. 두 질의 모두 끝에 예측이 있으므로, 두 경우 모두'IEnumerable '이 결과로 나타납니다. 표현식 유형이 항상 동일하면 필터를 적용하는 것이 분명한 작업입니다. –

답변

0

다른 테이블에서 MyClass 인스턴스를 만들려고하므로 동적 쿼리를 만들면 (즉, EF 또는 LINQ-to-SQL을 버리는) 문제가 발생하거나 대신 기본 조회를 수행해야하는 문제가 있습니다.

나는 기본적인 조회를 제안하고이 같은 일을 할 것을 :

var fetch = new Dictionary<string, Func<Context, IQueryable<MyClass>>>() 
{ 
    { "94", db => db.Table94.Select(i => new MyClass(i.A, i.B, i.C)) }, 
    { "95", db => db.Table95.Select(i => new MyClass(i.A, i.B, i.C)) }, 
}; 

이것은 당신이 지금 쉽게 MyClass 인스턴스를 꺼내 수있는 범용 사전 내에서 강력한 형식의 쿼리를 작성합니다. 이 같은

뭔가 :

var query = fetch[input](db).Where(addtionalFilteringDoneHere); 
DataGridView.DataSource = query; 

당신은 당신이 경우 그 구문을 더 좋아 fetch[input].Invoke(db)를 사용할 수 있습니다.

어떻게 해결 될까요?