如果条件在 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));
}
我有一个无法完全工作的 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));
}