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 &&
您只需将其添加为现有条件的一部分.您无法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)
(注意!删除)