我有一个包含3个文本框的视图,这些文本框绑定到ViewModel SupplierName
,Contact
,Address
中的属性以及一个绑定到ViewModel中SearchCommand
属性的按钮。
我的要求是根据上述属性过滤Supplier
条记录。我使用了EntityFramework。
用户可以输入任何上述文本框,这些文本框会导致我编写9个不同的查询。
例如,如果用户仅在SupplierName
文本框上输入数据,那么我需要以SupplierName
作为参数运行一个查询。如果用户输入SupplierName
和Contact
文本框,那么我需要运行另一个查询。等等。
这是我的代码:
public IEnumerable<Model.Supplier> GetAllSuppliersBySearch(string nameMatch, string contactMatch, string phoneMatch)
{
if(nameMatch!=null)
{
var q = from f in Context.Suppliers
where f.SupplierName==nameMatch
select f;
}
else if(contactMatch!=null)
{
var q = from f in Context.Suppliers
where f.ContactName==contactMatch
select f;
}
else if(phoneMatch!=null)
{
var q = from f in Context.Suppliers
where f.ContactName==contactMatch
select f;
}
return q.AsEnumerable();
}
如何使用一个查询或以任何优化方式完成此操作,而不是编写多个查询?
答案 0 :(得分:9)
使用lambda语法撰写查询:
IQueryable<Supplier> query = Context.Suppliers;
if (!String.IsNullOrEmpty(nameMatch))
query = query.Where(s => s.SupplierName == nameMatch);
if (!String.IsNullOrEmpty(contactMatch))
query = query.Where(s => s.ContactName == contactMatch);
// etc
return query.AsEnumerable();
另一个选择是为查询添加参数检查条件
var query =
from s in Context.Suppliers
where (String.IsNullOrEmpty(nameMatch) || s.SupplierName == nameMatch) &&
(String.IsNullOrEmpty(contactMatch) || s.ContactName == contactMatch)
// etc
select s;