0
目前,要使用EF CodeFirst和存儲庫模式進行搜索,基於用戶對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)子項的特定字段時,它就會生成一條新的「AND EXISTS」子句,因此生成的sql語句它檢查每個不同的字段,而不是在查詢中對Entity進行單個EXISTS,並檢查所有添加到查詢中的字段(即EntityOtherField1和EntityOtherField2)。我一直無法找到一種更好的方法來根據用戶輸入進行搜索,而不是經常檢查輸入內容(添加到搜索參數中)),然後添加到當前查詢的新位置。誰能告訴我是否有更好的方法來做到這一點?謝謝!
我認爲我可能遇到的更大問題是使用Include來確保Entity2在同一個實體/表上具有Any(存在)時返回衝突。 ...所以,即使我通過在Entity2子項列表上使用Any來限制我所尋找的內容,讓Include仍然會導致對該表的連接,這將會連接到該表中的所有記錄,即使我不' t想要它。我怎樣才能得到它,以便不使用Any來執行存在,而只是將這些參數檢查添加到當前子句而不是存在? – user1368182 2012-07-13 14:35:14