我使用了两种不同的方法来实现高级搜索,每种方法都有其优缺点。
用户可以使用3个参数(姓名,姓氏和手机号码)执行高级搜索。
我尝试的第一种方法是检查用户提供的这些参数中哪些已经提供;这需要我进行8个if和else checks检查(2 ^ 参数数量),并在每个条件中编写一个单独的查询,该查询接受相应的参数。例如,如果用户输入了姓名和姓氏,则查询的where子句将如下所示:
这种方式的优点是只需一次数据库查询,但缺点是需要编写更多的代码。
第二种方式是我声明了一个
以下是第二种方法的代码示例:
用户可以使用3个参数(姓名,姓氏和手机号码)执行高级搜索。
我尝试的第一种方法是检查用户提供的这些参数中哪些已经提供;这需要我进行8个if和else checks检查(2 ^ 参数数量),并在每个条件中编写一个单独的查询,该查询接受相应的参数。例如,如果用户输入了姓名和姓氏,则查询的where子句将如下所示:
where(x=>x.name.contains(name) && x.familyname.contains(familyname))
如果用户只输入了手机号码,查询语句的where子句将如下所示:
where(x=>x.mobile==mobile)
这种方式的优点是只需一次数据库查询,但缺点是需要编写更多的代码。
第二种方式是我声明了一个
IQueryable<>
对象,并首先以无条件向其中填充数据,然后逐个检查搜索参数,如果有任何参数具有值,则使用该值对 IQueryable
进行过滤,最后执行 .ToList()
。这种方式的优点是代码量大大减少,但会导致数据库查询两次,这是一个问题。以下是第二种方法的代码示例:
List<ShoppingCardForGridView> list_ShoppingCardForGridView =
new List<ShoppingCardForGridView>();
IQueryable<ShoppingCardForGridView> outQuery =
from x in db.ShoppingCards
orderby x.TFDateBackFromBank descending
where x.TFIsPaymentCompleted == true
select new ShoppingCardForGridView
{
Id = x.Id,
TFCustomerFullName =
x.Customer.TFName + " " + x.Customer.TFFamilyName,
TFDateBackFromBank = x.TFDateBackFromBank.Value,
TFIsDelivered = x.TFIsDelivered,
TFItemsPriceToPay = x.TFItemsPriceToPay,
TFDateBackFromBankPersian = x.TFDateBackFromBankPersian
};
if (!string.IsNullOrEmpty(CustomerFullName))
{
outQuery = outQuery.Where(x =>
x.TFCustomerFullName.Contains(CustomerFullName));
}
if (!string.IsNullOrEmpty(IsDelivered))
{
bool deliveryStatus = Convert.ToBoolean(IsDelivered);
outQuery = outQuery.Where(x => x.TFIsDelivered == deliveryStatus);
}
list_ShoppingCardForGridView = outQuery.ToList();
我想知道使用EntityFramework进行高级搜索的更好方法或最佳实践是什么?