如果条件在 linq

If condition in linq

我有一个无法完全工作的 linq 查询。来自 sql 服务器视图的查询 selects 用户能够 select 从四个单选按钮(使用单选列表相互排斥)之一的过滤器(在屏幕上),它们是活动的,新的,过时的,任何。因此,如果我 select Active、New、Obsolete 中的任何一个都有效,因为此值用于查询(RBstatus.SelectedValue),但我无法让 linq 判断 'Any' 是否为 selected 错过了过滤器,只输出所有内容。完整的查询是

    var query = (from b in context.mpcViewFormulas.Where(X => 
                    X.FormulaCode.Contains(formualcode)
                    && X.BaseCode.Contains(txtBase.Text)
                    && X.Status.Contains(RBstatus.SelectedValue))    

我想要做的是,如果 'Any' 单选按钮被 selected 然后错过查询的最后一个 && (&& X.Status.Contains(RBstatus.SelectedValue) 或者是这是错误的方法吗?

我试过的是

   var query = (from b in context.mpcViewFormulas.Where(X => 
                   X.FormulaCode.Contains(formualcode)
                   && X.BaseCode.Contains(txtBase.Text)
                   if(RBstatus.SelectedValue !="Any")
                   {
                       && X.Status.Contains(RBstatus.SelectedValue)
                   })

此抛出错误查询正文必须以 select 子句或组子句和无效表达式 trem &&

结尾

您只需将其添加为现有条件的一部分。您不能在中间添加 if 语句。换句话说,类似于:

X.FormulaCode.Contains(formualcode) && 
X.BaseCode.Contains(txtBase.Text) &&
(RBstatus.SelectedValue == "Any" || X.Status.Contains(RBstatus.SelectedValue))

或者,由于这些都是逻辑与,您可以简单地链接 Where 子句,即:

var query = (from b in context.mpcViewFormulas.Where(X => X.FormulaCode.Contains(formualcode)
                                             && X.BaseCode.Contains(txtBase.Text));
if (RBstatus.SelectedValue != "Any")
{
    query = query.Where(X => X.Status.Contains(RBstatus.SelectedValue));
}

只要您在再次调用 Where 之前不通过迭代查询或将其转换为列表来评估查询,您仍然只会发出一个查询。

更新

如果 "Any" 实际上不是一个值,那么您基本上只需要排除或包含每个可能的选定值。例如,在上面的第一个方法中,条件需要从 RBstatus.SelectedValue == "Any" 更改为:

(RBstatus.SelectedValue != "Active" && RBstatus.SelectedValue != "New" && RBstatus.SelectedValue != "Obsolete")

您还可以通过使用字符串数组来减少冗长:

!(new string[] { "Active", "New", "Obsolete" }).Contains(RBstatus.SelectedValue)

不过,这是否真的不那么可读是值得商榷的。

在第二种方法中,由于最初的条件是 RBstatus.SelectedValue != "Any",因此您需要执行与我刚才概述的相反的操作。换句话说:

(RBstatus.SelectedValue == "Active" || RBstatus.SelectedValue == "New" || RBstatus.SelectedValue == "Obsolete")

(new string[] { "Active", "New", "Obsolete" }).Contains(RBstatus.SelectedValue)

(注意删除了 !

楼上的人给了你一个答案,另一种选择是记住你可以链接条件直到它们被执行,所以这样的事情也是有效的:

var query = (from b in context.mpcViewFormulas.Where(X => X.FormulaCode.Contains(formualcode) && X.BaseCode.Contains(txtBase.Text));
if(RBstatus.SelectedValue !="Any")
{
    query = query.Where(X => X.Status.Contains(RBstatus.SelectedValue));
}