2014-12-10 1 views
0

우리는 엔티티 프레임 워크 컨텍스트에서 객체를 검색하기 위해 사용자 정의 리포지토리 클래스를 만들었습니다. Get 메서드는 항상 전체 개체를 반환합니다.LINQ를 사용하는 사용자 정의 투영 연산자

매개 변수로 프로젝트 운영자 선택을 포함하고 싶습니다. 그래서 외부에서 우리가 선택할 수있는 것을 선택해야합니다. & SQL 쿼리가 더 효율적입니다. 그것은 가능합니까?

public class GenericRepository<TEntity> where TEntity : class 
{ 
    internal DbContext context;   
    public IEnumerable<TEntity> Get(
     Expression<Func<TEntity, bool>> filter = null, 
     Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null) 
    { 
     IQueryable<TEntity> query = dbSet; 

     if (filter != null) 
     { 
      query = query.Where(filter); 
     } 
     if (orderBy != null) 
     { 
      return orderBy(query).ToList(); 
     } 
     else 
     { 
      return query.ToList(); 
     } 
    } 
} 
+1

의 사용을 만들 수 있습니다 저장소의 사용자에게 LINQ의 모든 권한을 부여 하시겠습니까? 또한 저장소를 사용하지 마십시오. 특히 "일반"것들. – Euphoric

+1

@ 행복감 사람들에게 리포지토리를 사용하지 말라고 말하면 이유를 말해주십시오. – DavidG

+0

Automapper 투영을 보았습니까? – lopezbertoni

답변

1

T이 엔티티의 유형 인 쿼리를 수행하는 방법에 params Expression<Func<T, object>>[] properties 매개 변수 (속성 선택기)를 추가합니다. 방법에 따라 다음 호출은

private static PropertyInfo ResolveProperty<T>(Expression<Func<T, object>> property) where T : class 
    { 
     MemberExpression member; 

     UnaryExpression body = property.Body as UnaryExpression; 
     if (body != null) 
     { 
      member = (MemberExpression)body.Operand; 
     } 
     else 
     { 
      member = (MemberExpression)property.Body; 
     } 

     PropertyInfo info = (PropertyInfo)(member).Member; 
     return info; 
    } 

이제 각 속성에 대한 정보를 얻으려면, 당신은 속성에 대한 정보가있을 때, 당신은 사용자 정의 구현을 계속 또는 왜 그냥 된 IQueryable을 반환 System.Linq.Dynamic

https://dynamiclinq.codeplex.com/

+0

감사합니다. 내 질문에 대한 답변입니다. 그러나 응용 프로그램의 핵심 클래스 중 하나에서 반사를하는 것은 최선의 선택이 아닌 것 같습니다. – Abhijeet

+0

Euphoric에서 제안한대로 IQueryable을 반환하지 않아야합니다. – Abhijeet

+0

Entity Framework에서 작업 할 때 많은 반성이 필요합니다. 쿼리 컴파일, 개체 구체화 등으로 걱정하지 않아도됩니다. 그렇습니다. 'IQueryable'은 실제 결과가 아닌 쿼리 선언 (표현식)을 나타내므로 확실한 방법입니다. – Andrew

관련 문제