2017-04-14 20 views
0

현재는,이 같은 일반 저장소 있습니다일반 리포지토리에 Expression <Func <TEntity, bool >>을 적용 하시겠습니까?

public virtual IQueryFluent<TEntity> Query(Expression<Func<TEntity, bool>> query) 
    { 
     return new QueryFluent<TEntity>(this, query); 
    } 

을 그리고 다음과 같이 구현 : 나는 일반적인 식을 구축 할 수 있도록, 역할 ID는, 모든 엔티티에 나타납니다

var obj = _repository.Query(x => x.RoleID == ID).Select().FirstOrDefault(); 

때문에

//Check and get RoleID if exist this column 
    PropertyInfo info = typeof(TEntity).GetProperty("RoleID"); 
    if (info != null) 
     Expression<Func<TEntity, bool>> filter = (p => p.RoleID ??? or p.info ??? == 5); 

어떻게 Generate Repository의 TEntity에서 알 수없는 열로 필터를 만들 수 있습니까? 아니면 필터에 where 절을 사용할 수 있습니까?

var obj = _repository.Query().Select().FirstOrDefault(); 

알려 주시기 바랍니다 :

내 목적은 그냥 그런 간단한 구조로 데이터를 쿼리 할 필요가 있다는 것입니다.

감사합니다. 사용 IRoleIdentifiedEntity와 다른 저장소 개체에 대한

class GenericRepository<T> where T : IEntity 
{ 
    public IEnumerable<T> Query(Expression<Func<T, bool>> predicate) 
    { 
     throw new NotImplementedException(); 
    } 
} 

: 사용, 모든 엔티티에 대한

interface IEntity { } 
interface IRoleIdentifiedEntity : IEntity 
{ 
    int RoleID { get; } 
} 

일반 저장소 :

+0

'IHasRole {int RoleID {get; set;}}와 같은 인터페이스를 구현하는 것이 가장 좋습니다. 모든 엔티티에서 사용하고이를 사용하십시오. 도움을 주신 Evk에게 – Evk

+0

감사합니다. –

답변

0

당신은 같은 인터페이스를 사용하여 역할 ID와 그 실체를 수정할 수 있습니다

class RoleIdentifiedRepositoryBase<T> : GenericRepository<T> 
    where T : IRoleIdentifiedEntity 
{ 
    public IEnumerable<T> Query(int id) 
    { 
     return Query(e => e.RoleID == id); 
    } 
} 
+0

안녕하세요 Danny Chen, 내 RoleID는 .edmx에 의해 작성되었으며 SQL의 테이블 열입니다. 부동산 정보를 얻고 이에 대한 작업을 위해 반사경을 사용할 수 있습니까? –

+0

.edmx에서 생성 된 클래스는 부분적이므로, 자동 생성 된 파일을 수정하지 않고 인터페이스로 확장 할 수 있으므로 문제가되지 않습니다. – Evk

+0

@Langthang Reflection은이 경우 도움이되지 않습니다. Evk이 말했듯이 부분 클래스를 사용할 수 있습니다. –