내 데이터베이스 컨텍스트 클래스에서 DbSet을 선언하려고합니다. 클래스 (Entity Framwork 클래스) 사용자가 호출하지 않기 때문에. 그래서 DbSet을 동적으로 선언하고 싶습니다.신고 방법 DbSet <dynamic>?
0
A
답변
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를 사용하여 이름을 찾습니다. 내 솔루션은 여기에 조회 테이블 정의 테이블이 있습니다. 동적 쿼리는 모두 부터 시작하여으로 시작한 다음 해당 정의 테이블의 값을 사용하여 필요한 유형을 작성합니다.
무엇을 시도 했습니까? 특정 유스 케이스는 무엇입니까? 모든 것을 컨텍스트에서 명시 적으로 정의한 다음 다른 레벨에서 동적 인 작업을 수행하는 것이 더 좋습니다. – kettch