Kar*_*ooz 5 c# search entity-framework
我使用两种不同的方法来实现高级搜索,其中每种方法都有其优点和缺点.
用户可以使用3个参数(名称,姓氏和移动设备)执行高级搜索.
我尝试的第一种方法是检查用户提供了哪些参数; 需要我做8 if
&else
检查(2 ^数量的参数),并在每个条件我写如果用户已经输入的名称和姓氏的其中查询的子句将看起来像它接受相应的参数,例如一个单独的查询这个:
where(x=>x.name.contains(name) && x.familyname.contains(familyname))
Run Code Online (Sandbox Code Playgroud)
或者在另一种情况下,如果用户只输入了移动设备,则查询的where子句将如下所示:
where(x=>x.mobile==mobile)
Run Code Online (Sandbox Code Playgroud)
这种方式的优点是我打了一次数据库,但缺点是我必须编写更多的代码.
我尝试的第二种方式是我声明了一个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();
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法或最佳实践来使用entityframework执行高级搜索?
您没有使用第二个解决方案多次访问数据库.请记住,IQueryable
对象本身是查询,而不是查询的结果.延迟执行直到实际迭代查询.有条件地Where
根据各种if
检查附加多个子句正在改变查询本身,而不是处理查询的结果(因为在那个时间点没有结果).
您可以在数据库上使用分析器来验证是否只执行了一个查询,并且一个查询包含该过程中的所有过滤.
这是一种相当普遍的模式; 我在许多实例中使用它来制作自定义搜索页面.
归档时间: |
|
查看次数: |
2363 次 |
最近记录: |