C# 如何使linq查询有条件地不应用where子句

C# 如何使linq查询有条件地不应用where子句,c#,sql,linq,C#,Sql,Linq,我甚至不知道如何表达我想要的,所以这里有一些代码 //jobTerm if (!String.IsNullOrEmpty(vm.SelectedJobTerm)) { vacancies = vacancies.Where(x => (!x.IsExternalPost && x.JobTerm.Name.Contains(vm.SelectedJobTerm))); } //jobType if (!String.IsNullOrEmpt

我甚至不知道如何表达我想要的,所以这里有一些代码

//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数据库,因此我无法通过探查器运行它。飞行有点盲目。

您当前正在排除
IsExternalPost==true的记录

这将包括:

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

Grant的帖子是正确的,但由于使用
|
操作符执行延迟加载的方式,可以简化它(如果第一部分为true,它甚至不会检查或关心第二部分):

或者,如果要在同一查询中检查两个条件:

vacancies = vacancies.Where(x => x.IsExternalPost
                                || x.JobTerm.Name.Contains(vm.SelectedJobTerm)
                                || x.JobType.Name.Contains(vm.SelectedJobType));
使用如何

var predicate=PredicateBuilder.True();
//工作期限
如果(!String.IsNullOrEmpty(vm.SelectedJobTerm))
predicate=predicate.And(x=>x.JobType.Name.Contains(vm.SelectedJobType));
//工作类型
如果(!String.IsNullOrEmpty(vm.SelectedJobType))
predicate=predicate.And(x=>x.JobType.Name.Contains(vm.SelectedJobType));
谓词=谓词。或(x=>x.IsExternalPost);
空缺=空缺。其中(谓词);

您看过动态Linq吗?“继续您的业务”是否与“不应用where子句”相同?你所得到的实际上是不起作用的,还是你只是想用一种更短的方式来写它,而不必每次重复条件?你实际上只是想抓住所有外部职位和包含所选职位术语的职位?i、 其中(x=>x.IsExternalPost | | x.JobTerm.Name.Contains(vm.SelectedJobTerm))而不是使用动态链接,在这种情况下,表达式可能是一种很好的方法。有一些,但我喜欢皮特·蒙哥马利的《我想你的意思是包括?@failedprogramming:我想格兰特是说在最初的帖子中他们排除了他们,这是他们的问题,而OP建议他要在他的文章中保留他们。哈!我只是将此作为评论发布+1.
vacancies = vacancies.Where(x => x.IsExternalPost
                                || x.JobTerm.Name.Contains(vm.SelectedJobTerm)
                                || x.JobType.Name.Contains(vm.SelectedJobType));
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);