2012-04-04 1 views
1

우리는 사람을 얻는 방법이 있습니다. 우리는 EF 및 Ria Services를 사용하고 있습니다. 지금 상황이 우리가 GetPeople을 호출하고 한 상황 (예)에서 우리는 920 명의 사람들을 되 찾습니다. 우리는이 모든 정보로 표를 채 웁니다. 우리는이 앱이 성장함에 따라 모자를 씌워야한다고 결정했기 때문에 - 500. 우리는 우리가 사용할 수있는 일련의 필터를 가지고 있습니다. 그 중 한 해가 그 중 하나입니다. 그래서 검색 결과에 2012 필터를 추가하면 460 명이 돌아옵니다. 우리의 코드는 우리가 테이크 (500)을 추가Linq Take and Ria 서비스

return _personSearchRepository.All().Where(x => x.ProgramID == programID && x.PersonType == "Person").Take(500); 

return _personSearchRepository.All().Where(x => x.ProgramID == programID && x.PersonType == "Person"); 

에서 갔다 - 여기에 아무런 문제 - 우리가 어떤 필터를 첫 번째 검색은 500 명 반환이 코드를 추가 할 때 문제가 있습니다. 그러나 우리는 올해 필터를 추가 할 때 - 내가 79 내가 밖으로 가져 갔다 얻었 반입이 460을 기대하고 난 당신이 .Take(500) 후 올해 필터를 추가하는 경우 (460)

답변

1

를 받고 다시이었다, 필터는 500 명에게 적용됩니다. 두 번째 방법을 만들거나 기존 필터를 수정하여 필터에 대한 매개 변수를 포함시켜야합니다. .Take(500)을 호출하기 전에 적용 할 수 있습니다.

나는 당신의 방법을 클라이언트에 적용되는 필터가 기본적으로 이런 일이 발생할 것이다 경우, IQueryable<Person>를 반환한다고 가정 :

_personSearchRepository.All().Where(x => x.ProgramID == programID 
     && x.PersonType == "Person") 
    .Take(500).Where(x => x.CreatedYear = 2012); 

이처럼 보이게하는 방법을 수정하는 경우 :

IQueryable<Person> GetPersonsWithYearFilter(int year) 
{ 
    return _personSearchRepository.All().Where(x => x.ProgramID == programID 
      && x.PersonType == "Person" && x.CreatedYear = year) 
     .Take(500); 
} 

그러면 작동합니다.

위의 코드는 테스트되지 않았습니다.

+0

내 viewModel에서 다음과 같은 쿼리를 실행합니다. - var query = _context.GetPeopleSearchByProgramIDQuery (_currentUser.ProgramID) .Where (x => x.PersonStatus == "Active"); if (SelectedRecruitClass! = null) { query = query.Where (x => x.Year == SelectedYear.Year); } – gevjen

+0

@gevjen 쿼리가 실제로 실행되는 시점과 Where 절이 적용될 때 확인할 수 있습니다. SQL 프로파일 러는 실제로 실행 된 명령문을 결정하는 데 도움이 될 수 있습니다. 내 생각 엔'top 500'이라는 SQL 질의가 있지만 클라이언트 측에만 적용되는 해 필터가없는 SQL 질의가있을 것입니다. –

+0

완벽한 - 도와 주셔서 대단히 감사합니다. – gevjen