如何有条件地将LINQ查询不应用于Where子句



我什至不知道如何言语我想要什么,所以这里有一些代码!

//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数据库,因此我无法通过Profiler运行它。有点盲人。

您当前排除了 IsExternalPost == true的记录。

这将包括它们:

vacancies = vacancies.Where(x =>
    x.IsExternalPost || x.JobTerm.Name.Contains(vm.SelectedJobTerm));

使用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);

赠款的帖子是正确的,但是由于使用||运算符执行懒惰加载的方式,因此可以简化(如果第一部分是正确的,它甚至都不会检查或关心第二部分):

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));