【问题标题】:Nhibernate linq. The where extension method does not add the where clause to the SQL command, why?休眠LINQ。 where 扩展方法没有在 SQL 命令中添加 where 子句,为什么?
【发布时间】:2011-02-11 13:31:20
【问题描述】:

我想将 where 子句添加到 linq 语句中,但它的行为与我预期的不同。 当我使用此代码时:

IQueryable<Employee> EmpQuery = from e in Session.Query<Employee>() where e.Surname == "Test" select e;
        EmpQuery.ToList();

或者我使用这个代码:

IQueryable<Employee> EmpQuery = (from e in Session.Query<Employee>() select e).Where(e => e.Surname == "Test");
        EmpQuery.ToList();

where 子句包含在 SQL 命令中,但是当我这样尝试时:

IQueryable<Employee> EmpQuery = from e in Session.Query<Employee>() select e;
        EmpQuery.Where(e => e.Surname == "Test");

SQL 命令中不包含 where 子句。为什么是这样?是否有另一种方法可以动态地将条件添加到 Nhibernate Linq 查询?

【问题讨论】:

    标签: linq nhibernate


    【解决方案1】:

    您没有使用Where 的返回值。 LINQ 是围绕功能概念设计的 - 调用 Where 不会修改 现有 查询,它会返回一个应用过滤器的 查询。现有查询保持原样 - 这意味着您可以将其重新用于(例如)不同的过滤器。

    请注意,您当前的查询表达式(实际上是from x in y select x)毫无意义。我建议简单地写:

    var query = Session.Query<Employee>().Where(e => e.Surname == "Test");
    

    【讨论】:

    • 谢谢。现在看来很明显了。我在那里犯了一个小学生错误。但是让传奇人物 Jon Skeet 回答我的问题是值得的。
    【解决方案2】:

    为了澄清 Jon 的评论,您的实现可以通过以下调整:

    IQueryable<Employee> modifiedQuery = EmpQuery.Where(e => e.Surname == "Test");
    

    然后只需在 modifiedQuery 上调用适当的枚举器(ToList、ToArray、foreach)。而且我不会说它创建了一个完整的新查询,而是创建了一个环绕原始查询的查询(有点像适配器模式的行)。当然,您的示例不需要添加,但这是您将附加条件添加到现有 LINQ 表达式的方式,这就是您的问题实际提出的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-29
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多