C# Can';不要让延迟的LINQ语句在nHibernate中工作

C# Can';不要让延迟的LINQ语句在nHibernate中工作,c#,nhibernate,C#,Nhibernate,试图使用NHibernate的LINQ提供程序编写动态查询,但我遇到了一些问题。我的理解是LINQ查询被推迟到调用(即使用ToList()),因此我有以下代码: string[] filteredIds = new[] { "someIdNotInUse"}; var result = _products .GetAll() .Skip(0) .Take(10); if (filteredIds != null) { result.Where(x =>

试图使用NHibernate的LINQ提供程序编写动态查询,但我遇到了一些问题。我的理解是LINQ查询被推迟到调用(即使用ToList()),因此我有以下代码:

string[] filteredIds = new[] { "someIdNotInUse"};

var result = _products
    .GetAll()
    .Skip(0)
    .Take(10);

if (filteredIds != null) 
{
    result.Where(x => x.Child1.Child2.Any(z => filteredIds.Contains(z.Child3.Id)));
}

var r = result.ToList();

不应用条件块中的Where过滤器;当我跑步的时候,我得到了我期望没有的记录。但是,如果我删除where过滤器并将其直接附加到_products调用中,它将按预期工作。我是否误解了LINQ提供者的工作原理?在不为每个可能的过滤条件和组合重写查询的情况下,如何创建这样的查询?

LINQ中的方法不会影响调用它们的对象-它们返回一个表示调用结果的新对象。所以你想要:

if (filteredIds != null) 
{
    result = result.Where(...);
}

(可以认为这有点像在字符串上调用
Replace
Trim
——字符串是不可变的,因此只有返回值才重要。)

LINQ中的方法不会影响它们被调用的对象——它们返回一个表示调用结果的新对象。所以你想要:

if (filteredIds != null) 
{
    result = result.Where(...);
}
(将其视为有点像在字符串上调用
Replace
Trim
——字符串是不可变的,因此只有返回值才重要。)