RavenDB的"包含"是否支持构造文档ID,而不仅仅是选择一个?



这里的代码没有按预期工作。具体来说,对Include的调用似乎不会导致任何额外的文档被添加到会话中。因此,Load每一个都要花费一个完整的数据库命中。这是RavenDb 3.5。

我找不到以这种方式实际使用Include的示例。它们似乎都发出了一个"选择器",用于在文档中查找成员,该成员持有要包含的文本文档id。而我正在构建文档id并将其作为字符串返回。

session.Query<Coil>()
.Include(c => nameof(CoilState) + "/" + id)
.Include(c => nameof(CoilExt) + "/" + id)
.Include(c => nameof(Material) + "/" + c.MaterialCode)
.Where(c => c.CoilId == id)
.ToList()
.Select(c =>
Coil_Dto.ToCoilDto(
c
, session.Load<CoilState>(nameof(CoilState) + "/" + c.CoilId)
, session.Load<CoilExt>(nameof(CoilExt) + "/" + c.CoilId)
, session.Load<Material>(nameof(Material) + "/" + c.MaterialCode)
)
)
.SingleOrDefault()

我的问题是:Include可以这样使用吗?如果没有,有没有办法使用我构建的id来实现"包含"功能?

听起来您想要使用Lazy,而不是Include。


包括

.Include方法应传递对象上包含ID的属性的名称。

// Good:
// Note that StateId, ExtId, and MaterialId are all properties on our Coil class.
session.Query<Coil>()
.Include(c => c.StateId)
.Include(c => c.ExtId)
.Inclide(c => c.MaterialId);
// Bad:
session.Query<Coil>
.Include(c => "CoilStates/123")
.Include(c => "CoilExts/456")
.Include(c => "Materials/789")

简而言之,请确保您的.Include调用传递Coil类上属性的名称。这些属性应该包含字符串值,这些值是其他文档的ID。然后,它们将在一次数据库访问中全部加载。


懒惰

如果Include对您的场景没有意义,但您仍然希望在单个DB调用中加载不同的对象,请使用懒惰的API

// Lazily load the coil. No DB trip yet.
var lazyCoil = session.Query<Coil>()
.Where(...)
.Lazily();
// Lazily load a CoilState. No DB trip yet.
var lazyCoilState = session.Advanced.Lazily.Load<CoilState>("CoilStates/123");
// Lazily load a Material. Still no DB trip.
var lazyMaterial = session.Advanced.Lazily.Load<Material>("Materials/456");
// Grab one of the values. This will fetch all lazy loaded items in 1 trip.
var coil = lazyCoil.Value;
// Grab the other values. No DB trip needed; they're already loaded!
var coilState = lazyCoilState.Value;
var material = lazyMaterial.Value;

相关内容

最新更新