如果在linq语句中使用一行

时间:2014-04-27 09:55:06

标签: c# asp.net linq

我有多个下拉列表,默认值为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);

这是错误:

  

条件表达式的类型无法确定,因为没有隐式对话''和' int'

4 个答案:

答案 0 :(得分:2)

这里有两个问题:

  1. 您无法将值类型(在您的情况下为int)与null进行比较。
  2. 你需要选择一些东西。
  3. 这是查询的结构:

    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
    }
    

答案 1 :(得分:1)

如果您只想在where未设置时跳过ddl1条件,则可以在实际需要时有条件地添加where子句,类似于(使用所有ddls与同一领域相比有些愚蠢的例子)

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的那些子句不会以任何方式影响查询。

答案 2 :(得分: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..

     }

使用此方法,无论您的控件(在您的情境下拉列表中)是该控件下的另一个控件的成员/子控件,您将该控件作为参数传递给方法.Method检查从给定参数递归启动并检查所有子控件与给定控件相关的控件作为Method参数..

代码中的用法:

    //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");
    }
} 

希望这有助于......

答案 3 :(得分:0)

通过将“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);

这非常有用,例如你有一个带有多个texbox和下拉列表的搜索表单,用户可能会选择每一个,而你不知道哪一个会被选中,哪一个不会被选中。

简化示例:

在搜索按钮点击事件中:

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。