2011-11-01 100 views
0

我想从众多下拉列表中获取值,并根据所选选项构建一个where语句。如果他们没有被选中,那么他们应该被排除在选择陈述之外。ASP.NET C#LINQ条件WHERE子句

这是我如何做到这一点,但我认为它不能用linq这样完成。

IEnumerable<IGrouping<string, Forest>> treeQuery = 

     from trees in Forest 
     if (ddlType1.SelectedValue!=null) 
     { 
      string strWhere += trees.Type1 == ddlType1.SelectedValue 
     } 
     else if (ddlType2.SelectedValue!=null) 
     { 
      string strWhere += trees.Type2 == ddlType2.SelectedValue 
     } 
     where strWhere 
     orderby trees.Nuts 
     group trees by trees.TrunkColour; 

任何帮助将不胜感激。

这是之前我加入...

IEnumerable<IGrouping<string, Forest>> treeQuery = 

     from trees in Forest 
     where trees.Type1 == "oak" 
     orderby trees.Nuts 
     group trees by trees.TrunkColour; 
+0

你的第二个例子是在进行赋值,我想你想测试相等,即你有'='当我认为你的意思是== == –

+0

谢谢,刚刚更正。 – user1024416

+0

如果用户从ddlType1中选择了一个值并且ddlType2应该根据您的示例忽略ddlType2? –

回答

2

为了您的下拉列表中的每一个,可以将条款添加到您的地方:

where (ddlType1.SelectedValue == "" || trees.Type1 == ddlType1.SelectedValue) 
    && (ddlType2.SelectedValue == "" || trees.Type2 == ddlType2.SelectedValue) 
    // && (type 3...) 
+0

非常感谢所有的答复。这是我最终使用的解决方案。 – user1024416

1

由于这仅涉及两个条件,你可以做一个单一的LINQ查询这样的例子代码:

Forest.Where(tree => 
     (
      (ddlType1.SelectedValue == null || tree.Type1 == ddlType1.SelectedValue) && 
      (ddlType2.SelectedValue == null || tree.Type2 == ddlType2.SelectedValue) 
     )) 
     .OrderBy(tree => tree.Nuts) 
     .GroupBy(tree => tree.TrunkColour); 

虽然随着条件数量的增加,为了提高可读性,将查询拆分为单独的部分是值得的,因为此格式可能会因多个变量而快速无法读取。

7

在这种情况下,您可以使用查询的组合性质,但不希望使用查询表达式。所以:

// Or IEnumerable<Forest>, depending on the type involved... 
IQueryable<Forest> query = Forest; 
if (ddlType1.SelectedValue!=null) 
{ 
    query = query.Where(trees => trees.Type1 == ddlType1.SelectedValue); 
} 
else if (ddlType2.SelectedValue!=null) 
{ 
    query = query.Where(trees => trees.Type2 == ddlType2.SelectedValue); 
} 
var finalQuery = query.OrderBy(trees => tree.Nuts) 
         .GroupBy(trees => trees.TrunkColour); 

事实上这并不会执行询问,直到你开始使用的结果 - 所以,直到你“准备好了”,你可以添加筛选,排序方式等位位。