我一直在寻找这个问题的答案,但是一直没有找到一个符合我需要的答案。
下面的两个代码片段返回相同的东西,我没有偏好使用哪一个,我只是包括这两个,以防它帮助别人回答我的问题
private List<MyClass> GetMyClass(string name, string city, string state, string zip)
{
using (MyEntities ctx = new MyEntities())
{
var results = from a in ctx.MyEntity
where (a.Name == name &&
a.City == city &&
a.State == state &&
a.ZIP == zip)
select a;
return results.ToList();
}
}
private List<MyClass> GetMyClass(string name, string city, string state, string zip)
{
using (MyEntities ctx = new MyEntities())
{
var results = ctx.MyEntity.Where(a => a.Name == name)
.Where(a => a.City == city)
.Where(a => a.State == state)
.Where(a => a.ZIP == zip)
.Select(a => a);
return results.ToList();
}
}
在本例中,假设我有一个搜索屏幕,需要用户输入姓名和城市;State和ZIP为可选参数。查询必须至少搜索这两个字段,如果有必要,还必须搜索任何其他字段。
显然,在上面的例子中,如果用户只搜索Name和City,他们将得不到任何结果,因为查询将尝试匹配State == null和ZIP == null,因为没有提供这两个参数。
我如何重写这段代码,以只搜索已提供参数的字段?
你可以把它们串起来,像这样:
var results = ctx.MyEntity.AsQueryable();
if(name != null)
results = results.Where(a => a.Name == name);
// ... snip ...
if(zip != null)
results = results.Where(a => a.ZIP == zip)
return results.ToList();
var results = from a in ctx.MyEntity
where ((a.Name == name || name == null) &&
(a.City == city || city == null) &&
(a.State == state || state == null) &&
(a.ZIP == zip) || zip == null)
select a;