【发布时间】:2016-07-18 12:59:56
【问题描述】:
在我的 ASP.net MVC 项目中,我有一个包含 7 个搜索变量的搜索表单。它们都不是强制性的,但是,应该至少选择一个来执行搜索操作,如图所示。
在这种情况下使用 lambda 表达式执行搜索的最佳方法是什么,因为用户可以选择任何搜索参数组合?目前,我正在使用一长串“if-else if”结构并为每个结构编写单独的 lambda 表达式。有没有更好/更有效的方法?
更新 1: 这只是条件的一半,现在我被告知,即使是三个日期标准中的每一个的“日期”都是可选的,这将进一步增加检查列表。这是标准的做法吗?
IEnumerable<MyRecord> Request = null;
if (!status.Equals(""))
{
if (deliveryDateFrom == null && caseDateFrom == null && pickupDateFrom == null)
{
//only request status
Request = GetRecord("EquipRequest")
.Where(r => r.Status == status);
}
else if (deliveryDateFrom != null && caseDateFrom == null && pickupDateFrom == null)
{
// request status and delivery date
Request = GetRecord("EquipRequest")
.Where(r => r.Status == status && (r.DeliveryDate >= deliveryDateFrom && r.DeliveryDate <= deliveryDateTo));
}
else if (deliveryDateFrom == null && caseDateFrom != null && pickupDateFrom == null)
{
// request status and case date
Request = GetRecord("EquipRequest")
.Where(r => r.Status == status && (r.CaseDate >= caseDateFrom && r.CaseDate <= caseDateTo));
}
else if (deliveryDateFrom == null && caseDateFrom == null && pickupDateFrom != null)
{
// request status and pickup date
Request = GetRecord("EquipRequest")
.Where(r => r.Status == status && (r.PickupDate >= pickupDateFrom && r.PickupDate <= pickupDateTo));
}
else if (deliveryDateFrom != null && caseDateFrom != null && pickupDateFrom == null)
{
// request status, delivery date and case date
Request = GetRecord("EquipRequest")
.Where(r => r.Status == status && (r.DeliveryDate >= deliveryDateFrom && r.DeliveryDate <= deliveryDateTo)
&& (r.CaseDate >= caseDateFrom && r.CaseDate <= caseDateTo));
}
else if (deliveryDateFrom != null && caseDateFrom == null && pickupDateFrom != null)
{
// request status, delivery date and pickup date
Request = GetRecord("EquipRequest")
.Where(r => r.Status == status && (r.DeliveryDate >= deliveryDateFrom && r.DeliveryDate <= deliveryDateTo)
&& (r.PickupDate >= pickupDateFrom && r.PickupDate <= pickupDateTo));
}
else if (deliveryDateFrom == null && caseDateFrom != null && pickupDateFrom != null)
{
// request status, case date and pickup date
Request = GetRecord("EquipRequest")
.Where(r => r.Status == status && (r.CaseDate >= caseDateFrom && r.CaseDate <= caseDateTo)
&& (r.PickupDate >= pickupDateFrom && r.PickupDate <= pickupDateTo));
}
else if (deliveryDateFrom != null && caseDateFrom != null && pickupDateFrom != null)
{
// request status, delivery date, case date and pickup date
Request = GetRecord("EquipRequest")
.Where(r => r.Status == status && (r.DeliveryDate >= deliveryDateFrom && r.DeliveryDate <= deliveryDateTo)
&& (r.CaseDate >= caseDateFrom && r.CaseDate <= caseDateTo)
&& (r.PickupDate >= pickupDateFrom && r.PickupDate <= pickupDateTo));
}
}
【问题讨论】:
-
您只需要 6 个
if语句(每个条件一个)(并且不需要else if) -
向我们展示(至少部分)您的代码,以便我们提供帮助。
-
请发布您的代码以提供更好的解决方案。
-
var query = GetRecord("EquipRequest"); if (status != null) { query = query.Where(x => x.Status == status); } if (deliveryDateFrom != null) { query.Where(x => x.DeliveryDate >= deliveryDateFrom); }等(每个条件一个) -
@SJaka 如果它调用 Web 服务来获取所有记录然后过滤,这可能会对性能产生巨大影响。最好在服务中过滤您的结果并返回最少的数据。
标签: c# asp.net asp.net-mvc asp.net-mvc-4 lambda