【问题标题】:How can I have a linq query conditionally NOT apply a where clause如何有条件地进行 linq 查询不应用 where 子句
【发布时间】:2014-03-07 07:41:33
【问题描述】:

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

//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 数据库,所以我无法通过分析器运行它。飞行有点盲目。

【问题讨论】:

  • 你看过 Dynamic Linq 吗?
  • “Go about your business”和“do not apply where clause”一样吗?
  • 你所拥有的实际上是行不通的,还是只是你想要一种更短的方式来编写它,而不必每次都复制条件?
  • 您实际上是否只是想获取所有外部职位和包含 selectedjobterm 的职位?即 vacancies.Where(x => x.IsExternalPost || x.JobTerm.Name.Contains(vm.SelectedJobTerm))
  • 在这种情况下,表达式可以是一个很好的方法,而不是使用动态链接。那里有一些,但我喜欢 Pete Montgomery 的 Predicate Builder

标签: c# sql linq


【解决方案1】:

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

这将包括他们:

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

【讨论】:

  • 我想你的意思是包括?
  • @failedprogramming:我认为格兰特在原始帖子中说他们排除了他们,这是他们的问题,而 OP 建议他想将它们保留在他的文本中。
【解决方案2】:

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

【讨论】:

  • 哈!我只是将其发布为评论。 +1
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多