0

我有一个 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 的人来说,有一个额外的花絮,是否可以在不使查询字符串太长的情况下内联?

4

1 回答 1

2

您似乎正在尝试对 Raven 使用关系模型。它不会起作用,你最终会遇到更多的问题。

要解决您提到的特定问题,您可以使用延迟操作,这将强制将请求作为 POST 发送。

但同样,我强烈建议重新设计模型,使其适合文档数据库。

于 2013-10-14T19:28:28.917 回答