C# ASP.NET C LINQ条件WHERE子句

C# ASP.NET C LINQ条件WHERE子句,c#,asp.net,linq,C#,Asp.net,Linq,我试图从众多下拉列表中获取值,并根据所选选项构建where语句。如果未选中它们,则应将其从select语句中排除 这是我本来应该做的,但我想用linq这种方式是做不到的 IEnumerable<IGrouping<string, Forest>> treeQuery = from trees in Forest if (ddlType1.SelectedValue!=null) { string

我试图从众多下拉列表中获取值,并根据所选选项构建where语句。如果未选中它们,则应将其从select语句中排除

这是我本来应该做的,但我想用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; 

由于这只涉及两个条件,因此可以在单个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);

尽管随着条件数量的增加,为了提高可读性,将查询拆分为不同的部分是值得的,因为这种格式可能会因为多个变量而很快变得不可读

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

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

在您开始使用结果之前,这实际上不会执行查询,因此您可以在准备开始之前逐点添加筛选、排序等。

对于每个下拉列表,您可以在其中添加一个子句:

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

您的第二个示例是在我认为您希望测试相等性的地方进行赋值,即,您有=当我认为您的意思是==如果用户同时从ddlType1和ddlType2中选择了一个值,是否应根据您的示例忽略ddlType2?非常感谢所有回复。这就是我最终使用的解决方案。