2017-12-28 4 views
0

내 데이터베이스 컨텍스트 클래스에서 DbSet을 선언하려고합니다. 클래스 (Entity Framwork 클래스) 사용자가 호출하지 않기 때문에. 그래서 DbSet을 동적으로 선언하고 싶습니다.신고 방법 DbSet <dynamic>?

+0

무엇을 시도 했습니까? 특정 유스 케이스는 무엇입니까? 모든 것을 컨텍스트에서 명시 적으로 정의한 다음 다른 레벨에서 동적 인 작업을 수행하는 것이 더 좋습니다. – kettch

답변

0

필자는 귀하의 환경에서 모든 것을 명시 적으로 정의하려고 노력할 것입니다. 이 속성 선언에는 많은 기능이 포함되어 있습니다. 그 중 최소한의 것은 유형을 갖는 디자인 타임의 이점입니다.

동적 쿼리에 대한 기술은 많이 있지만 과거에 사용한 적이있는 조회 테이블을 동적으로 쿼리하기위한 기술을 게시 할 것입니다. 여기

public List<LookupItemDTO> LoadItems(int lookupId) 
{ 
    //nothing special here, just map the lookup id to a name 
    var lookupRepo = new LookupRepository<LookupDefinition>(uow); 
    var lookup = lookupRepo.Find(id); 

    //map the lookup's name from the table to a type. This is important DO NOT ACCEPT A TABLE NAME FROM THE USER. 
    var targetType = Type.GetType("MyApp.DomainClasses.Lookup." + lookup.Name + ",MyApp.DomainClasses"); 
    // this is an optional extra step but it allows us to instantiate an instance of our repository to ensure that business rules are enforced 
    var lookupType = typeof(LookupRepository<>).MakeGenericType(targetType); 
    dynamic LookupTable = Activator.CreateInstance(lookupType); 
    //just some pattern nonsense to wire up the unit of work 
    LookupTable.SetupUOW(uow); 

    //make sure to cast it into something you can work with ASAP 
    var data = ((IQueryable<LookupTableBase>)LookupTable.All).OrderByDescending(l => l.IsVisible).ThenBy(l => l.SortOrder); 

    var list = from li in data 
       select new LookupItemDTO 
       { 
        Id = li.Id, 
        Description = li.Description, 
        Display = li.Display, 
        SortOrder = li.SortOrder, 
        IsVisible = li.IsVisible 
       }; 

    return list.ToList(); 
} 

열쇠는 당신이 동적으로 테이블을 조회 할 수 있다는 것입니다,하지만 높은 수준에서 그것을하는 것이 좋습니다. 또한, 당신과 당신의 사용자 입력 사이에 어떤 종류의 간접적 인 지시를하십시오. 목록에서 표를 선택하게하고 해당 표의 ID를 사용하여 이름을 찾습니다. 내 솔루션은 여기에 조회 테이블 정의 테이블이 있습니다. 동적 쿼리는 모두 부터 시작하여으로 시작한 다음 해당 정의 테이블의 값을 사용하여 필요한 유형을 작성합니다.