2017-12-14 21 views
0

새 params를 메서드에 추가 할 수없고 DataQuery의 논리를 변경할 수없는 상황에 있습니다. 그래서이 메서드와 비슷한 구조로 메서드의 내용을 변경할 수 있습니다 및linq의 where 절을 가로 채고 오버라이드

IEnumerable<T> Get<T>(DataQuery<T> query) { 
    var collection = repo; 
    return query.Apply(repo).ToList(); 
} 

내 문제는 내가 날 내 팀, 또는 내 회사에 할당 된 TS를 검색하거나 지원을 추가하려면,하지만 난 "저를 어떤 상황에 액세스 할 수 없다는 것입니다 T.의 특성 "호출 지점에서 - 메서드의 UserContext에서 사용할 수 있습니다.

DataQuery<T>.Apply()을 사용하면 T.caseId <= 4과 같은 Ts 속성을 쿼리 할 수 ​​있으며 사례 1 ~ 4의 목록을 반환합니다. source.Where(t => t.caseId <= 4)

내 아이디어로 번역되는이 .Where(t => t.IsMineQuery == true) 또는 .Where(t => t.IsMyTeamQuery == true)에 전화 차단

bool IsMineQuery 
bool IsMyTeamQuery 
bool IsMyCompanyQuery 

다음을 T와 .Where(t => t.UserId == UserContext.UserId) 또는 .Where(t => UserContext.TeamIds.Contains(t.TeamId))로 다시 다음 필드를 추가하는 것입니다하지만 난 방법을 전혀 생각이 없다 전화를 가로 챈다.

어떻게해야합니까?

+0

질문을 완전히 이해하지 못했지만 'IsMineQuery {get UserId == UserContext.UserId}'충분하지 않아도됩니까? – Heinzi

+0

@Heinzi 아니요.'IsMyQuery' getter에서'UserContext'를 사용할 수 없기 때문입니다. – dasblinkenlight

+1

'DataQuery '이란 무엇입니까? 당신이 그것을 제어 할 수 있습니까? 어떻게 구성하고 쿼리합니까? –

답변

0

그래서 밤새도록 주변에서 돌풍을 시작한 후 돌파했습니다.

나는 사용자 지정 쿼리 제공했습니다 -이 튜토리얼 사용 : 다음 내 컨트롤러

IEnumerable<T> Get<T>(DataQuery<T> query) { 
    var collection = new MyQueryable(repo, UserContext); 
    return query.Apply(repo).ToList(); 
} 

가 그럼 난 튜토리얼의 "InnerMostWhereFinder"이 경우 식별하는 변경의 형식은 https://msdn.microsoft.com/en-us/library/bb546158.aspx

을 내 쿼리가 IsMineQuery 또는 IsMyTeamQuery를 가져 와서 UserContext.TeamIds.Contain (x => x.Team.Id)으로 바꿉니다. 매력처럼 작동하지만 직접적인 해결책은 아닙니다.