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