【问题标题】:ASP.NET C# LINQ conditional WHERE clauseASP.NET C# LINQ 条件 WHERE 子句
【发布时间】:2011-11-01 20:12:44
【问题描述】:

我正在尝试从众多下拉列表中获取值并根据所选选项构建 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; 

【问题讨论】:

  • 你的第二个例子是在我认为你想测试相等性的地方进行分配,即你有=,而我认为你的意思是==
  • 如果用户同时从 ddlType1 和 ddlType2 中选择一个值,是否应该按照您的示例忽略 ddlType2?

标签: c# asp.net linq


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    对于每个下拉菜单,您可以在 where 中添加一个子句:

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

    【讨论】:

    • 非常感谢所有回复。这是我最终使用的解决方案。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      相关资源
      最近更新 更多