1

尝试使用 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 过滤器;当我运行 .ToList 时,我得到了我期望没有的记录。但是,如果我删除 where 过滤器并将其直接附加到 _products 调用,它会按预期工作。我是否误解了 LINQ 提供程序的工作原理?如何在不为每个可能的过滤条件和组合重写查询的情况下创建这样的查询?

4

1 回答 1

5

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

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

(把它想象成有点像在一个字符串上调用ReplaceTrim- 字符串是不可变的,所以只有返回值才是重要的。)

于 2012-07-30T12:51:05.620 回答