2017-04-26 1 views
0

나는 코드를 단순화하고 압축하여 가능한 한 코드 중복을 제거하려고합니다. 나는 RavenDB 콜렉션을 쿼리하는 메소드를 가지고 있으며 쿼리는 내가 쿼리 할 타입에 적응해야한다. 이 유형은 메소드에 전달 된 매개 변수에 따라 변경되며 where 절도 적응해야합니다. 다른 유형이 Level1_AdministrativeAreas에서 Level5_AdministrativeAreas로 파생되는 AdministrativeArea 기본 유형이 있습니다. 시나리오에 따라, I 등 AdministrativeAreas, Level1_AdministrativeAreas를 쿼리해야RavenDB 쿼리에 동적 매개 변수 사용

내가 현재 무엇을 가지고 :

private void Merge(MergeLevel currentMergeLevel, IDocumentSession currentSession) 
    { 
    (...) 
IQueryable<AdministrativeArea> query; 
    if (currentMergeLevel == MergeLevel.Level1) 
     query = currentSession.Query<AdministrativeArea, AdminAreaName>() 
     .Where(area => !string.IsNullOrEmpty(area.NAME_0) && !string.IsNullOrEmpty(area.NAME_1)); 
    (...) 
    } 

가 메소드 매개 변수로 유형을 전달하고는 적용이 어떤 방법이 있나요 이 같은 쿼리 : 나는 컴파일 타임에 여러 가지 문제에 직면 한

private void Merge(MergeLevel currentMergeLevel, IDocumentSession currentSession, Type requiredType, Type indexType) 
    { 
     (...) 
    IQueryable<requiredType> query; 
     if (currentMergeLevel == MergeLevel.Level1) 
      query = currentSession.Query<requiredType, indexType>() 
      .Where(area => !string.IsNullOrEmpty(area.NAME_0) && !string.IsNullOrEmpty(area.NAME_1)); 
     (...) 
     } 

, 즉 "변수이지만 형처럼 사용된다", 그리고 사실 그 멤버 변수 (NAME_0, NAME_1 등) 수 ' 컴파일러가 "무엇이 오는지"를 알지 못하기 때문에 추론 할 수 없습니다. 이 작업을 수행 할 수 없다고 생각합니다. 그러나 이것은 각 유형의 쿼리에 대해 다른 메소드를 작성하거나 다소 큰 메소드를 작성해야하므로 코드 관리에 영향을 미칩니다. 어느 쪽도 매력적이지는 않지만 그 주위에는 어떤 방법도 보이지 않는다.

+1

매우 명확하지는 않지만 generics를 사용해보십시오. void Merge (int currentMergeLevel , IDocumentSession currentSession) – Embri

답변

0

형식으로 필터링하는 좋은 방법은 인덱스의 "select"절에 Raven-Entity-Name 필드를 포함시키는 것입니다. 그러면 EntityType 필드를 사용하여 형식을 필터링 할 수 있습니다. 당신은 내장 레이븐/DocumentsByEntityName 인덱스에

그래서를 인덱스 이런 종류의 예를 볼 수 있습니다, 색인은 다음과 같이 나타납니다 :이 작업을 것이라고

from doc in docs 
let entityType = doc["@metadata"]["Raven-Entity-Name"] 
where entityType.EndsWith("_AdministrativeAreas") 
select new 
{ 
    EntityType = entityType, 
    //the rest of the fields 
} 

주 기존 클라이언트 API를 통해 문서를 삽입하는 경우 (원시 REST API는 자체 Raven-Entity-Name을 추가하지 않음)

+0

Michael, 재미있는 접근법입니다. 나는 그것에 대해 생각하지 않았습니다! 제네릭에 익숙해지면서 제 문제에 대한 해결책을 제공하는 것으로 나타났습니다. 나는 당신의 제안 된 접근 방식으로 놀 것입니다. 고맙습니다 ! –