如果条件在linq

use*_*910 1 c# linq if-statement conditional-statements

我有一个linq查询,我无法完全工作.查询从sql server视图中选择用户能够从四个单选按钮(使用无线电列表互斥)中选择一个过滤器(在屏幕上),它们是Active,New,Obsolete,Any.因此,如果我选择Active,New,Obsolete中的任何一个,因为在查询中使用了这个值(RBstatus.SelectedValue)但是我不能让linq说如果选择'Any'而错过过滤器并输出所有东西.完整的查询是

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

我想要做的是如果选择'任意'单选按钮然后错过最后一个&&关闭查询(&& 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)
                   })
Run Code Online (Sandbox Code Playgroud)

这个抛出错误查询主体必须以select cluse或group子句结束,并且无效表达式trem &&

Chr*_*att 6

您只需将其添加为现有条件的一部分.您无法if在中间添加语句.换句话说,像:

X.FormulaCode.Contains(formualcode) && 
X.BaseCode.Contains(txtBase.Text) &&
(RBstatus.SelectedValue == "Any" || X.Status.Contains(RBstatus.SelectedValue))
Run Code Online (Sandbox Code Playgroud)

或者,由于这些都是逻辑AND,您可以简单地链接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));
}
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

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

(RBstatus.SelectedValue != "Active" && RBstatus.SelectedValue != "New" && RBstatus.SelectedValue != "Obsolete")
Run Code Online (Sandbox Code Playgroud)

通过使用字符串数组,您也可以稍微冗长一点:

!(new string[] { "Active", "New", "Obsolete" }).Contains(RBstatus.SelectedValue)
Run Code Online (Sandbox Code Playgroud)

然而,这是否真的不具有可读性是值得商榷的.

在第二种方法中,由于最初的条件是RBstatus.SelectedValue != "Any",你需要做与我刚才概述的相反的方法.换一种说法:

(RBstatus.SelectedValue == "Active" || RBstatus.SelectedValue == "New" || RBstatus.SelectedValue == "Obsolete")
Run Code Online (Sandbox Code Playgroud)

要么

(new string[] { "Active", "New", "Obsolete" }).Contains(RBstatus.SelectedValue)
Run Code Online (Sandbox Code Playgroud)

(注意!删除)