【问题标题】:Can we delete clauses from linq expression?我们可以从 linq 表达式中删除子句吗?
【发布时间】:2011-03-03 03:36:20
【问题描述】:

我想知道是否可以从 linq 表达式/查询运算符中添加/删除 where 子句。

例如:-

var qry = from e in emp where(e => e.salary > 5000) select e;

以后可以去掉where表达式吗?

提前致谢:)

【问题讨论】:

  • 据我所知,这是不可能的。
  • 你的意思是:from e in emp select e?

标签: c# linq expression linq-expressions expressionvisitor


【解决方案1】:

是的,这是可能的,但是您需要实现一个ExpressionVisitor 类来评估复合表达式并根据您的需要进行更改。除非您正在做相对复杂的事情,否则可能有更好的方法来完成您想要的事情。

【讨论】:

  • 你的答案似乎真正理解并尝试回答这个问题。 +1
【解决方案2】:

据我所知,您只能调整过滤器

例如,如果根据条件 e.salary > 5000 尝试删除,您应该尝试类似

var diffQry = from e in emp where(e => e.salary <= 5000) select e;

【讨论】:

    【解决方案3】:

    如果您想以编程方式添加和删除 where 子句,您可以使用查询运算符。

    var query = emp.Select(x => x);
    
    if (someCondition)
      query = query.Where(x => x.Price > 50);
    

    您需要进一步扩展您的问题。

    【讨论】:

    • @Psycho :- 我想删除添加后的位置。
    【解决方案4】:

    如果qryIQueryable&lt;T&gt;——例如,LINQ-to-SQL 或 LINQ-to-Entities 查询——那么应该可以分析底层表达式树并构建一个新的表达式树,不包括Where 子句。

    如果qry 是一个普通的IEnumerable&lt;T&gt;——例如,LINQ-to-Objects 查询——那么这不能完成,因为没有表达式树可供分析。

    【讨论】:

    • - 说如果它是 IQuerable,你能给我一些关于如何删除子句的 sn-p 吗?
    • @Kar Cheng:这不是真正可以用一个小sn-p演示的东西。正如@smartcaveman 建议的那样,您需要一些严肃的代码才能正确执行此操作,可能使用ExpressionVisitor
    【解决方案5】:

    如果有条件查询,我认为WHERE 子句是必需的。否则(如果没有条件)你可以使用:

    var qry = from e in emp select e;
    

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多