c# - 如果条件在 linq

标签 c# linq if-statement conditional-statements

我有一个无法完全工作的 linq 查询。查询从 sql server View 中选择,用户能够从四个单选按钮(使用单选列表相互排斥)之一选择过滤器(在屏幕上),这些单选按钮是事件的、新的、过时的、任意的。因此,如果我选择 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))    

我想做的是,如果选择了“任何”单选按钮,则错过查询中的最后一个 && (&& 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)
                   })

这抛出错误查询主体必须以选择子句或组子句和无效表达式 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)

(注意 ! 已被删除)

关于c# - 如果条件在 linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27823626/

相关文章:

c# - 执行 SQL 命令最适合 DRY 的方法是什么?

c# - 如何使用 C# LINQ Union 获取自定义 list1 与 list2 的联合

mysql - 编写一个查询,选择与 session ID 关联的用户名

c# - 从 List<T> 到数组 T[] 的转换

c# - 使用 Reflection.Emit 设置属性值

c# - Windows 8.1 背景音频播放器在应用程序的其他页面中不起作用

java - if (a - b < 0) 和 if (a < b) 之间的区别

swift - 如何使我的 if 语句更有效率?

c# - 有没有办法将任务并行库 (TPL) 与 SQLDataReader 一起使用?

c++ - 不明白 "#define for if-statement"