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

C# 使用Any的LINQ RavenDB子集合查询不能在查询中包含非索引变量,c#,linq,ravendb,C#,Linq,Ravendb,我一直在四处寻找,似乎找不到答案 假设我有以下几点: 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> GetAllItemsGr

我一直在四处寻找,似乎找不到答案

假设我有以下几点:

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();
   }
}
公共类实体a
{
公共字符串EntityAID{get;set;}
公共列表版本{get;set;}
}
公共类实体B
{
公共整数成本{get;set;}
}
公共列表GetAllItemsCreaterAntwenty(bool?someOverridingFlag)
{
使用(var session=GetSession())
{
var entityAList=来自会话中的entA.Query()
其中entA.Versions.Any(entB=>someOverridingFlag==null | | entB.Cost>20)
选择恩塔
返回EntityList.ToList();
}
}
所以问题在于,由于someOverridingFlag“无法查询未索引的字段”,此查询无法工作

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

我现在唯一的解决方法就是使用不同的查询,先检查标志,然后再进行不同的查询

我做错什么了吗


提前谢谢

如果“外部”条件没有转换为包含查询可访问字段之一的表达式,那么除了不可能之外,将它们包含在查询中也没有任何意义

对于您提供的比较做作的示例,您可以简单地执行以下操作:

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();
    }
}
另一个重要问题是,您正在一个潜在的无限结果集上执行非分页查询。RavenDB将限制结果的数量,即,如果可能的匹配数超过128或服务器限制,您将无法获得所有结果


有关这些主题的更多信息,请参阅和。

嗨,Alex,我同意,示例很差,但有点匆忙,没有发布完整的代码。API本身更像是一个搜索API,一些搜索参数可以省略,这就是我提问的原因。正如我所怀疑的,它需要基于参数条件的不同类型的查询。还有,我知道默认查询集被设置为128,这对我来说只有一次,所以我从这个假设中学到了一些东西。谢谢你的帮助。我也遇到了这个问题。尽管如此,我不认为这可以被视为“非常糟糕的API设计”。相反,这是处理bool参数的一种可接受且有利的方法,例如
。其中(f=>includeInactive | | f.IsActive)
。在EF中,这转换为
其中{true | false}或record.IsActive
。似乎是Raven的LINQ实现的一个缺点。
public List<EntityA> GetAllItemsGreaterThanTwenty();
public List<EntityA> GetAllItems();