我有一个 ravendb 查询,它导致错误“此请求的查询字符串的长度超过了配置的 maxQueryStringLength 值”。从 ravendb 服务器。我知道这是因为 dingerIds (local var) 中有太多的值。
查询看起来像这样:
...
// raven is an open document session
var hums = (from hum in raven.Query<Hum>()
where hum.Dingers.Any(dinger => dinger.Status.In(x, y, z))
select hum).ToList();
var dingerIds = (from hum in hums
from dinger in hum.Dingers
where dinger.Status.In(x, y, z)
select dinger.Id).ToList();
var zips = raven.Query<Zip>().
Where(zip => zip.DingerIds.Any(dingerId => dingerId.In(dingerIds))).
ToList();
以下是所涉及的类和属性以供参考。类型的组织可能并不理想,但这是我坚持的:
class Hum { List<Dinger> Dingers {get;set;} ... }
class Dinger { string Id {get;set;} ... } // Id is a homespun unique Id
class Zip { List<string> DingerIds {get;set;} ... }
为了解决这个问题,我认为实时投影是答案,我开始尝试使用 Map 和 TransformResult 编写 AbstractIndexCreationTask(知道升级到 2.5 时需要将其更新为 AbstractTransformerCreationTask)。这是我走了多远,显然不是那么远:
Map = hums =>
from hum in hums
from dinger in hum.Dingers
where dinger.Status.In(x, y, z)
select new { dinger.Id };
TransformResults = (database, hums) =>
from hum in hums
from dinger in hum.Dingers
let zip = database. // ?? where to go from here
也许我正在处理这个错误。这可以在索引中完成吗?而且,对于我们所有仍在学习 ravendb 的人来说,有一个额外的花絮,是否可以在不使查询字符串太长的情况下内联?