2012-04-04 11 views
1

私たちは人を手に入れる方法があります。私たちはEFとRia Servicesを使用しています。方法は今、私たちはGetPeopleを呼び出し、ある状況(例)で920人を返す。この情報をすべて網羅しています。私たちのアプリが成長して以来、私たちはこれを上限にするべきだと決めました - 500。私たちはまた、私たちが使うことができる一連のフィルターを持っています。年の1つです。だから、2012年のフィルターを検索に入れたとき、私は460人を返します。私たちのコードでは、我々が取る(500)を追加Linq Take and Ria Services

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人を返され、このコードを追加したときに問題があります。 しかし、我々は今年のフィルタを追加するとき - 私は460を戻すことを期待する私は、取り出して、あなたが.Take(500)年後のフィルタを追加した場合、私は戻って460

答えて

1

を得るためだったを取った79 を得ましたそれらの500人にフィルタが適用されます。 2番目のメソッドを作成するか、既存のフィルタを変更してフィルタのパラメータを組み込む必要があります。このパラメータは、.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プロファイラは、実際に発行されたステートメントを判断するのに役立ちます。私の推測では、「トップ500」というSQLクエリが1つありますが、クライアント側でのみ適用されるような年フィルタはありません。 –

+0

パーフェクト - ご協力いただきありがとうございます。 – gevjen

関連する問題