現在、mvc 検索ビュー/ページの複数のテキスト ボックスへのユーザー入力に基づいて、EF CodeFirst とリポジトリ パターンを使用して検索を行うには、次のようにします。
public PagedList<Entity1> PlayerUserSearch(Entity1SearchParameters searchParameters, int? pageSize, int? startEntity, Func<Entity1, object> sortOrder, bool sortDesc)
{
IQueryable<Entity1> query = from entities in this.DataContext.Entity1s.Include("Entity2List")
where entities.Entity2List.Any()
select entities;
if (searchParameters.Entity2PrimaryKeyId.HasValue)
query = query.Where(e => e.Id == searchParameters.Entity2PrimaryKeyId.Value);
if (searchParameters.HasStats.HasValue)
{
if (searchParameters.HasStats.Value)
query = query.Where(u => u.Entity2List.Any(e => e.Stat != null));
else
query = query.Where(u => u.Entity2List.Any(e => e.Stat == null));
}
if (searchParameters.Entity2OtherField.HasValue)
query = query.Where(u => u.Entity2List.Any(e => e.Event.Entity2OtherField == searchParameters.Entity2OtherField));
if (searchParameters.Entity2OtherField2.HasValue)
query = query.Where(u => u.Entity2List.Any(e => e.Event.Entity2OtherField2 == searchParameters.Entity2OtherField2));
if (searchParameters.Active.HasValue)
query = query.Where(e => e.Active == searchParameters.Active.Value);
return this.GetPageByStartEntity(pageSize.Value, startEntity.Value, query, sortOrder, sortDesc);
}
これに関する問題は、特定のフィールドの Entity1 (Entity2) の子をチェックする別のフィールドを追加するたびに、生成された SQL ステートメントに新しい "AND EXISTS" 句が追加されるため、クエリで Entity に対して単一の EXISTS を実行し、クエリに追加したすべてのフィールド (つまり、EntityOtherField1 および EntityOtherField2) をチェックするのではなく、テーブル Entity2 が存在し、チェックされたさまざまなフィールドごとにもう一度テーブル Entity2 をチェックします。ユーザー入力に基づいて検索を行うためのより良い方法を見つけることができませんでした。そこにある入力を常にチェックし (検索パラメーターに追加します)、現在のクエリの新しい場所を追加します。これを行うためのより良い方法があるかどうか誰かに教えてもらえますか? ありがとう!