在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"
这里有两个问题:
- 您不能将值类型(在您的情况下为int)与null进行比较
- 你需要选择一些东西
这是查询的结构:
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。