Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate linq。where扩展方法没有将where子句添加到SQL命令,为什么?_Linq_Nhibernate - Fatal编程技术网

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

Nhibernate linq。where扩展方法没有将where子句添加到SQL命令,为什么?,linq,nhibernate,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.Quer

我想将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();
IQueryable EmpQuery=来自会话中的e.Query(),其中e.姓氏==“Test”选择e;
EmpQuery.ToList();
或者我使用以下代码:

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();
IQueryable EmpQuery=(从Session.Query()中的e中选择e)。其中(e=>e.姓氏==“Test”);
EmpQuery.ToList();
SQL命令中包含where子句,但当我这样尝试时:

IQueryable<Employee> EmpQuery = from e in Session.Query<Employee>() select e;
        EmpQuery.Where(e => e.Surname == "Test");
IQueryable EmpQuery=来自会话中的e。Query()选择e;
EmpQuery.Where(e=>e.姓氏==“Test”);

SQL命令中不包括where子句。为什么会这样?有没有其他方法可以动态地向Nhibernate Linq查询添加条件

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

请注意,您当前的查询表达式(
从x中选择x
,实际上)是毫无意义的。我建议只写:

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

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

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

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

谢谢。现在看来很明显。我在那里犯了一个小学生的错误。但让传奇人物乔恩·斯基特回答我的问题是值得的。