【发布时间】:2015-02-05 12:27:01
【问题描述】:
我有以下方法:
protected override List<Contractor> GetSearchResults()
{
List<User> users = UnitOfWork.UserRepository.Get(
user =>
(!String.IsNullOrEmpty(FirstName) && user.FirstName.Contains(FirstName)) &&
(!String.IsNullOrEmpty(LastName) && user.LastName.Contains(LastName)))
.ToList();
return users ;
}
这只是一个“简化”的例子。实际上,我的 where 条件还有一些“列”。
这两个“条件”都与一个与运算符 (&&) 相关联。这意味着:
- 必须填写名字并且必须匹配AND
- 第二个名字必须填写且必须匹配
这不是我想要的。使用或运算符 (||) 更改代码,例如
protected override List<Contractor> GetSearchResults()
{
List<User> users = UnitOfWork.UserRepository.Get(
user =>
(!String.IsNullOrEmpty(FirstName) && user.FirstName.Contains(FirstName)) ||
(!String.IsNullOrEmpty(LastName) && user.LastName.Contains(LastName)))
.ToList();
return users ;
}
没有提供想要的解决方案,因为:
- 必须填写名字并且必须匹配或
- 第二个名字必须填写并匹配
那么,我想要什么?
例如,如果我必须在我的数据库中跟踪记录:
- 怀特,保罗
- 米勒,约翰
- 米勒,莉亚
我希望得到以下结果:
- 如果只输入姓氏“Miller”,我想获得两个 记录。
- 如果输入了姓氏和名字(“Miller”和“John”),我希望只获得一条记录。
我的条件不符合这些要求,我不知道如何“简单地”改变它们。
这样更合适吗:
protected override List<Contractor> GetSearchResults()
{
List<User> users = UnitOfWork.UserRepository.Get(
user =>
(String.IsNullOrEmpty(FirstName) || (!String.IsNullOrEmpty(FirstName) && user.FirstName.Contains(FirstName))) &&
(String.IsNullOrEmpty(LastName) || (!String.IsNullOrEmpty(LastName) && user.LastName.Contains(LastName))))
.ToList();
return users ;
}
这似乎有效。但是随着越来越多的列,它肯定看起来很难看并且难以阅读。有什么方法可以简化这个任务?
【问题讨论】:
-
我相信
(String.IsNullOrEmpty(FirstName) || (!String.IsNullOrEmpty(FirstName) && user.FirstName.Contains(FirstName)))可以简化为user.FirstName.Contains((FirstName ?? ""))。
标签: c# wpf entity-framework linq-to-objects unit-of-work