Nhibernate linq。 where扩展方法不会将where子句添加到SQL命令中,为什么?

时间:2011-02-11 13:31:21

标签: linq nhibernate

我想将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查询添加条件?

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

为了澄清Jon的评论,通过以下调整,您的实施将会很好:

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

然后只需在modifiedQuery上调用相应的枚举器(ToList,ToArray,foreach)。我不会说它创建了一个完整的新查询,而是创建一个包装原始的查询(适配器模式的行)。当然,您的示例不需要添加,但这是您在现有LINQ表达式上添加其他条件的方式,这就是您的问题实际问题。