我甚至不知道如何说出我想要的东西,所以这里有一些代码!
//jobTerm
if (!String.IsNullOrEmpty(vm.SelectedJobTerm))
{
vacancies = vacancies.Where(x => (!x.IsExternalPost
&& x.JobTerm.Name.Contains(vm.SelectedJobTerm)));
}
//jobType
if (!String.IsNullOrEmpty(vm.SelectedJobType))
{
vacancies = vacancies.Where(x => (!x.IsExternalPost
&& x.JobType.Name.Contains(vm.SelectedJobType)));
}
上面发生的是我正在运行一系列if语句,如果某些事情适用,则添加到我的linq查询中。我将执行推迟到最后。如果有帮助,这适用于搜索结果过滤器。
在上面的代码中,您看到我试图放入Where子句,如果空缺是外部帖子,我希望查询不关心vm.SelectedJobTerm或vm.SelectedJobType。我需要这个适用于我的所有过滤器。逻辑应该是这样的
-Is there a value in vm.SomeValue?
|_____>Yes
| |_____>Is this an external post?
| |__>Yes->do not apply where clause
| |
| |__>No->Apply the where clause stuff
|
|____>No-> Go about your business.
有没有办法在linq中执行此操作?
我应该注意到我正在使用azure数据库,所以我无法通过分析器运行它。飞得有点失明。
答案 0 :(得分:4)
您目前正在排除IsExternalPost == true
。
这将包括他们:
vacancies = vacancies.Where(x =>
x.IsExternalPost || x.JobTerm.Name.Contains(vm.SelectedJobTerm));
答案 1 :(得分:4)
如何使用PredicateBuilder
?
var predicate = PredicateBuilder.True<MyClass>();
//jobTerm
if (!String.IsNullOrEmpty(vm.SelectedJobTerm))
predicate = predicate.And(x => x.JobType.Name.Contains(vm.SelectedJobType));
//jobType
if (!String.IsNullOrEmpty(vm.SelectedJobType))
predicate = predicate.And(x => x.JobType.Name.Contains(vm.SelectedJobType));
predicate = predicate.Or(x => x.IsExternalPost);
vacancies = vacancies.Where(predicate);
答案 2 :(得分:1)
Grant的帖子是正确的,但是由于使用||
运算符执行延迟加载的方式可以简化(如果第一部分为true,它甚至不会检查或关心第二部分) :
vacancies = vacancies.Where(x => x.IsExternalPost
|| x.JobTerm.Name.Contains(vm.SelectedJobTerm));
或者,如果要在同一查询中检查两个条件:
vacancies = vacancies.Where(x => x.IsExternalPost
|| x.JobTerm.Name.Contains(vm.SelectedJobTerm)
|| x.JobType.Name.Contains(vm.SelectedJobType));