Поддерживает ли RavenDb `Include` создание идентификатора документа, а не просто его выбор? - PullRequest
0 голосов
/ 10 декабря 2018

Этот код не работает должным образом.В частности, кажется, что вызовы Include не приводят к добавлению каких-либо дополнительных документов в сеанс.Таким образом, каждый из Load стоит полный удар по дб.Это RavenDb 3.5.

Я не смог найти примеров, которые действительно используют Include таким образом.Кажется, все они испускают «селектор», который используется для поиска члена в документе, и этот член содержит буквальный идентификатор документа для включения.Принимая во внимание, что я создаю идентификатор документа и возвращаю его в виде строки.

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 таким образом?Если нет, то есть ли какой-нибудь способ для достижения этой функции «включения» с помощью моих созданных идентификаторов?

1 Ответ

0 голосов
/ 11 декабря 2018

Звучит так, как будто вы хотите использовать Lazy, а не Include.


Include

. В метод .Include следует передавать имя свойства вашего объекта (объектов)который содержит идентификатор.

// 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 .Эти свойства должны содержать строковые значения, которые являются идентификаторами других документов.Затем все они будут загружены за одну поездку в базу данных.


Ленивый

Если Включить не имеет смысла для вашего сценария, но вы все равно хотите загрузить разрозненные объектыв одном вызове БД используйте lazy 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;
...