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暗中在后台创建了一个索引。但是,究竟如何读取外部变量并将其作为查询表达式的一部分呢?
我现在唯一的工作是有不同的查询,先检查标志,然后以不同的方式查询。
我做错了什么吗?
提前感谢!
如果-正如您的示例中的情况-"外部"条件不转换为涉及查询可访问字段之一的表达式,那么-除了不可能的事实之外- 在查询中包含它们也没有意义。
对于您提供的这个相当做作的示例,您可以简单地这样做:
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设计,因为如果someOverridingFlag
是null
,该方法不会像其名称所承诺的那样做。最好为这两种不同的情况包含显式方法。
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。