2012-10-29 2 views
1

실행할 데이터베이스 쿼리 목록이있는 응용 프로그램이 있습니다. 같은SqlQuery for unknown (컴파일시) 유형

var results = _db.Contacts.SqlQuery(sQuery); 

과 :

내가 좋아하는 뭔가를 그 수를 알고
var results = _db.Database.SqlQuery<Contacts>(sQuery); 

하지만 내 상황에서

, 나는 메타 데이터 만 일하고 있어요. 어떻게 이런 식으로 뭔가를 할 수 있습니다

string sBaseType = "Contacts"; 
var results = _db.Database.SqlQuery<sBaseType>(sQuery); 

내가 <object>에 어느 정도 성공했다 ... 그것은 모두 내가가 예상 행,하지만하지 매우 유용한 형태를 반환했습니다. 다양한 동적 쿼리를 처리하는 가장 좋은 방법은 무엇입니까?

if (sBaseType == "Contacts") { 
    var results = _db.Contacts.SqlQuery(sQuery); 
} else if (sBaseType == "Buildings") { 
    var results = _db.Buildings.SqlQuery(sQuery); 
} else if (sBaseType == "Rooms") { 
    var results = _db.Rooms.SqlQuery(sQuery); 
} else if (sBaseType == "Equipment") { 
    var results = _db.Equipment.SqlQuery(sQuery); 
} 

I 돈 : 나는처럼 보이는 구성을 피할 수 있도록

var results = _db.Database[sBaseType].SqlQuery(sQuery); 

: -

편집 은 내가 찾을 희망하고있어 오히려이 같은 몇 가지 메커니즘입니다 특별히 멋진 것을 필요로하지 않습니다 ... 나는 단지 100 개 이상의 요소 if-elseif 블록을 저장하는 것을 희망합니다 ...

답변

1

이 내 주요 문제 : 해결하기 위해 나타납니다

string sQuery = vo.objReport.sQuery; 
object[] aParams = {} ; //loaded through some other, related, process... 

var tt = Type.GetType("MyProject.DAL." + vo.objReport.sBaseView); 
var result =_db.Database.SqlQuery(tt, sQuery, aParams); 

실행할 수있는 쿼리에 대한 메타 데이터의 무리 감안할 때, 그것은 쿼리를 실행하고 사용 가능한 형식으로 데이터를 반환 할 수 있습니다.

1

일종의 유형 해결 사전을 시도해 볼 수 있습니다.

public abstract class MetadataQuery 
{ 
    public abstract string Type { get; } 
    public abstract string QueryString { get; } 
} 

public class ContactsQuery : MetadataQuery 
{ 
    public override string Type { get { return "Contact"; } } 
    public override string QueryString { get { return "select * from Contacts where is_deleted = 0"; } } 
} 

각 유형에 대한 쿼리를 작성하십시오.

다음으로 유형 목록을 컴파일하십시오. 대부분의 IoC 컨테이너가 이것을 할 수 있습니다. Ninject를 사용하면 다음과 같이 할 수 있습니다. 그리고 동적 인 타입은 이것을 훨씬 더 사소한 것으로 만듭니다.

kernel.Bind<MetadataQuery>().To<ContactsQuery>(); 
// keep doing this for all of your metadata queries. 

마지막으로 실제로 쿼리를 사용할 준비가되었습니다. 당신이 절대적으로 해야가 아닌 동적 유형이있는 경우

public class MyClass 
{ 
    private readonly IDbConnection db; 
    private readonly IDictionary<string, MetadataQuery> queries; 

    public MyClass(IDbConnection db, IEnumerable<MetadataQuery> queries) 
    { 
    this.db = db; 
    this.queries = queries.ToDictionary(q => q.Type); 
    } 

    public IEnumerable<dynamic> ExecuteSQL(string type) 
    { 
    var query = queries[type]; 
    var result = db.Query(query.QueryString); 
    return result; 
    } 
} 

, 당신은 MakeGenericType으로 볼 필요 해요,하지만 거의 쉽지 않을 것입니다.

+0

방금 ​​거대한 if-elseif 구문을 작성하는 것보다 쉽지 않은 것처럼 보입니다. 위의 '내가 찾고자하는 바'에 대한 편집을 참조하십시오. – reidLinden

+0

'쉬운 것'이 아닙니다. 이것은 (a) 귀하의 문제를 해결하고 (b) 공개 원칙을 위반하지 않는 것을 의미합니다. 이 솔루션은 두 가지 모두를 수행합니다. –

+0

고맙습니다. 당신의 대답이 내 머리 위에 조금있다는 것을 인정합니다 : D – reidLinden