LINQ RavenDB子集合查询使用Any,查询中不能包含非索引变量

本文关键字:查询 不能 包含非 索引 变量 Any RavenDB 子集合 LINQ | 更新日期: 2023-09-27 17:50:03

我一直在四处寻找,似乎找不到这个问题的答案。

假设我有以下内容:

public class EntityA
{
    public string EntityAID { get; set; }
    public List<EntityB> Versions { get; set; }
}
public class EntityB
{
    public int Cost { get; set; }
}

public List<EntityA> GetAllItemsGreaterThanTwenty(bool? someOverridingFlag)
{
   using(var session = GetSession())
   {
       var entityAList = from entA in session.Query<EntityA>()
                         where entA.Versions.Any(entB => someOverridingFlag == null || entB.Cost > 20)
                         select entA
       return entityAList.ToList();
   }
}

所以问题在于,这个查询不工作,因为someOverridingFlag, "不能查询未索引的字段"。

我知道raven暗中在后台创建了一个索引。但是,究竟如何读取外部变量并将其作为查询表达式的一部分呢?

我现在唯一的工作是有不同的查询,先检查标志,然后以不同的方式查询。

我做错了什么吗?

提前感谢!

LINQ RavenDB子集合查询使用Any,查询中不能包含非索引变量

如果-正如您的示例中的情况-"外部"条件不转换为涉及查询可访问字段之一的表达式,那么-除了不可能的事实之外- 在查询中包含它们也没有意义

对于您提供的这个相当做作的示例,您可以简单地这样做:

public List<EntityA> GetAllItemsGreaterThanTwenty(bool? someOverridingFlag)
{
    using(var session = GetSession())
    {
        if (someOverridingFlag == null)
            return session.Query<EntityA>().ToList(); // Note: unbounded result set will be limited to max 128 docs
        else
            return (from entA in session.Query<EntityA>()       
                    where entA.Versions.Any(entB => entB.Cost > 20)
                    select entA).ToList();
    }
}

但这将是一个非常糟糕的API设计,因为如果someOverridingFlagnull,该方法不会像其名称所承诺的那样做。最好为这两种不同的情况包含显式方法。

public List<EntityA> GetAllItemsGreaterThanTwenty();
public List<EntityA> GetAllItems();
另一个重要的问题是,您正在对可能无界的结果集执行非分页查询。RavenDB将限制结果的数量,即如果可能的匹配数量超过128或服务器限制,您将无法获得所有结果。

有关这些主题的更多信息,请参阅http://ravendb.net/docs/article-page/2.0/csharp/intro/safe-by-default和http://ravendb.net/docs/article-page/2.5/csharp/client-api/advanced/unbounded-results。