【问题标题】:dynamic query in where clause for linq using c#使用c#在where子句中为linq动态查询
【发布时间】:2011-08-03 19:12:37
【问题描述】:

我有以下代码,我过滤掉不属于“type1”的类型。

List = Details.Where(p => p.Type != Constants.Type1).ToList();

现在我必须动态创建 where 查询,在其中我可以有更多用于过滤数据的子句。

所以上面代码的修改版本是

List = Details.Where(p => p.Type != Constants.Type1 && p.Type != Constants.Type2 ).ToList();

请建议我如何在 c# 中实现这一目标

【问题讨论】:

  • 不确定 asp.net 是如何关联的?

标签: c# linq


【解决方案1】:
var ExcludedTypes = new Type[] { Constants.Type1, Constants.Type2 };
List = Details.Where(p => !ExcludedTypes.Contains(p.Type)).ToList();

【讨论】:

    【解决方案2】:

    您可以多次调用Where(请记住,这不会影响您调用它的查询;只是返回值)。例如:

    var query = Details.Where(p => p.Type != Constants.Type1);
    if (avoidType2)
    {
        query = query.Where(p => p.Type != Constants.Type2);
    }
    List = query.ToList();
    

    编辑:请注意,我会将这种方法用于通用动态过滤。如果你总是想只按类型过滤,而它只是变化的有效类型列表,那么我会使用 George 的方法。

    【讨论】:

    • 但在您的代码中,它不会迭代两次 1 以检查 type1,然后再次检查 type2。我不能一口气做到这一点吗?
    • @Amit:不,不会。 exact 行为将取决于您的提供程序(例如 LINQ to SQL 与 LINQ to Objects),但逻辑结果是每个过滤器依次应用 从查询返回的每个项目。请注意,由于 LINQ 的惰性,Where 调用本身执行迭代。
    • 所以你的意思是当你做“List = query.ToList();”时在您的代码中,实际过滤是在哪里完成的,而不是我们调用“where”方法的地方?
    • @Amit:是的,就是这样。我强烈建议您在过度使用 LINQ 之前阅读它的工作原理。进入正确的心态非常重要。
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2011-04-03
    相关资源
    最近更新 更多