ASP.NET C#LINQ条件WHERE子句

时间:2011-11-01 20:12:45

标签: c# asp.net 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; 

3 个答案:

答案 0 :(得分:8)

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

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

在您开始使用结果之前,这实际上不会执行查询 - 因此您可以逐位添加过滤,排序等,直到您“准备好”为止。

答案 1 :(得分:2)

对于每个下拉列表,您可以在您的位置添加一个子句:

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

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

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