在linq语句中使用一行if

本文关键字:一行 if linq 语句 | 更新日期: 2023-09-27 18:00:26

我有多个默认值为0的下拉列表,表示用户没有选择任何选项,其他数字表示用户选择了一个值,应该包括在LINQ查询中。我的问题是我无法检查用户是否在下拉列表中选择了任何选项?

这是我尝试的第一个下拉列表:

var ddl1 = Convert.ToInt32(ddlDastgAhasli.SelectedValue);

var project = (from p in context.Projects 
               where Convert.ToInt32(p.DastgahEjraeiAsli) == ((ddl1 == 0) ? null : ddl1) select p);

这就是错误:

无法确定条件表达式的类型,因为不存在隐式会话"answers"int"

在linq语句中使用一行if

这里有两个问题:

  1. 您不能将值类型(在您的情况下为int)与null进行比较
  2. 你需要选择一些东西

这是查询的结构:

var project = (from p in context.Projects where p.prop == 1 select p);

这个来解析int:

错误

string strInt = "7";    
if(Convert.ToInt32(strInt) == null) //  compilation error 

良好

string strInt = "7";   
int intVal;
if(int.TryParse(strInt, out intVal))
{
   // intVal is an integer
}
else
{
  // intVal isnt an integer
}

如果您只想在未设置ddl1时跳过where条件,您可以在实际需要时有条件地添加where子句,类似于(所有ddl都与同一字段进行比较的愚蠢示例)

var project = (from p in context.Projects select p);
if(ddl1 != 0)
{
    project = project.Where(Convert.ToInt32(p.DastgahEjraeiAsli) == ddl1);
}
if(ddl2 != 0)
{
    project = project.Where(Convert.ToInt32(p.DastgahEjraeiAsli) == ddl2);
}
...

这将有效地要求ddlx != 0为true的所有where子句以及ddl为0的子句不会以任何方式影响查询。

这里有一个非常有用的扩展方法,我在项目中使用它来解决各种检查。。这不仅仅是关于ASP.NET。你可以在winforms等中使用它,也可以在中使用它

    public IEnumerable<Control> GetAll(Control control)
     {        
       var controls = control.Controls.Cast<Control>();
       return controls.SelectMany(ctrl => GetAll(ctrl))
       .Concat(controls)
       .Where(c => c.Visible == true);
//If you don't need to check that the control's visibility then simply ignore the where clause..
     }

使用此方法,无论您的控件(在您的情况下是dropdownlists)是该控件下的另一个控件的成员/子控件,您将该控件作为参数传递给该方法。。方法检查从给定参数递归启动,并将与给定控件相关的所有子控件作为方法参数进行检查。。

代码中的用法:

    //Its Assumed you need to check DropDownList' SelectedIndex property
      List<Control> dropDownsOfPageWhichTheirSelectedIndexIsZero
                            = new List<Control>( GetAll ( YourAspNetPage )
                              .Where( x => x is DropDownList 
                              && ( ( DropDownList ) x ) . SelectedIndex == 0 ) ) ;
// Lets check if our page has dropdowns which their SelectedIndex equals to Zero
if ( dropDownsOfPageWhichTheirSelectedIndexIsZero . Count > 0 )
{
  // do your work what you need in your project
  //suppose you need their names and do something with this name (i.e.warn a message to user)
    foreach ( DropDownList ddl in dropDownsOfPageWhichTheirSelectedIndexIsZero )
    {
      alert ("Please Check "+ ddl.Name +".Should Chost other than '"Select'" option");
    }
} 

希望这能有所帮助。。

问题通过放入"Convert.ToInt32(p.DastgahEjraeiAsli)"而不是null来解决,因此如果ddl1==0(用户没有选择任何项目),则跳过。

var project = (from p in context.Projects 
           where Convert.ToInt32(p.DastgahEjraeiAsli) == ((ddl1 == 0) ? Convert.ToInt32(p.DastgahEjraeiAsli) : ddl1) select p);

例如,当你有一个带有多个文本框和下拉列表的搜索表单,用户可以选择其中的每一个,而你不知道哪个会被选中,哪个不会被选中时,这是非常有用的。

简化示例:

在搜索按钮点击事件中:

int ddl1 = Convert.ToInt32(dropdownlist1.selectedvalue);
int ddl2 = Convert.ToInt32(dropdownlist2.selectedvalue);
string txt1 = textbox1.text;

var project = (from p in context.mytable
                       where p.field1 == ((ddl1 == 0) ? p.field1 : ddl1)
                                   && p.field2 == ((ddl2 == 0) ? p.field2 : ddl2)
                                   && p.field3 == ((txt1 == "") ? p.field3 : txt1)
                       select p).ToList();

gridview1.datasource = project;
fridview1.databind();

不是:每个下拉列表都有一个默认值,text="select an item",value="0",所以如果用户没有选择任何选项,默认值将保持为0。