2012-04-04 32 views
1

Wir haben eine Methode, wo wir Menschen bekommen. Wir verwenden EF und Ria Services. So wie die Dinge jetzt sind, rufen wir GetPeople auf und in einer Situation (Beispiel) bekommen wir 920 Leute zurück. Wir füllen ein Raster mit all diesen Informationen. Wir haben uns entschieden, da unsere App wächst, dass wir eine Obergrenze von 500 festlegen sollten. Wir haben eine Reihe von Filtern, die wir auch verwenden können. Das Jahr ist einer von ihnen. Wenn ich also einen Filter von 2012 auf unsere Suche setze, gebe ich 460 Leute zurück. Unser Code ging von diesemLinq Take und Ria Services

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

zu

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

wir den Take (500) hinzugefügt - Problem ist, wenn wir diesen Code die erste Suche ohne Filter zurück 500 Personen aufgenommen - keine Probleme hier. Aber wenn wir das Jahr Filter hinzufügen - wo ich 460 erwartet werden, brachte ich bekam 79. ich das herausnehmen nahm und ich war wieder 460.

Antwort

1

zu bekommen Wenn Sie das Jahr Filter nach dem .Take(500) hinzufügen, Dann wird der Filter auf diese 500 Personen angewendet. Sie müssen eine zweite Methode erstellen oder die vorhandene ändern, um einen Parameter für den Filter einzufügen, der dann angewendet werden kann, bevor Sie .Take(500) aufrufen.

Ich gehe davon aus, dass Ihre Methoden IQueryable<Person> zurückkehren, in welchem ​​Fall ein Filter auf den Client angewendet wird grundsätzlich in etwa wie folgt ergeben:

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

Wenn Sie die Methode ändern wie folgt aussehen:

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

dann sollte es funktionieren.

Der obige Code wurde nicht getestet.

+0

in meinem Ansichtsmodell führen wir unsere Anfragen wie diese - var query = _context.GetPeopleSearchByProgramIDQuery (_currentUser.ProgramID) .Where (x => x.PersonStatus == "Aktiv"); if (SelectedRecruitClass! = null) { query = query.Where (x => x.Year == SelectedYear.Year); } – gevjen

+0

@gevjen Sie möchten überprüfen, an welchem ​​Punkt Ihre Abfrage tatsächlich ausgeführt wird und wann die 'Where' -Klausel angewendet wird. Ein SQL-Profiler kann dabei helfen festzustellen, welche Anweisungen tatsächlich ausgegeben werden. Meine Vermutung ist, dass Sie eine SQL-Abfrage mit 'top 500' haben werden, aber ohne den Jahr-Filter, der anscheinend nur auf der Client-Seite angewendet wird. –

+0

Perfekt - vielen Dank für Ihre Hilfe .. – gevjen

Verwandte Themen