繁体   English   中英

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

[英]How can I have a linq query conditionally NOT apply a where clause

我甚至不知道如何说出我想要的东西,所以这里有一些代码!

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM