У меня есть следующий беспроблемный запрос API Neo4jClient, который используется для возврата локализованного текста для игр Xbox, хранящихся в моей базе данных Neo4j:
var localized = client.Cypher
.OptionalMatch("(xb:'XboxProfile')-[p:PLAYS]->(g:'XboxGame')-[:LOCALE]->(l:'XboxGameLocalized')")
.Where((Xbox.Profile xb) => xb.GamerTag == xboxProfile.GamerTag)
.AndWhere((Xbox.Localization.Game l) => l.Locale == locale)
.Return((l, g, p) => new {
Localized = l.As<Xbox.Localization.Game>(),
Game = g.As<Xbox.Game>(),
LastPlayed = p.As<DateTimeOffset>()
})
.Results.ToList();
На PLAYS
отношений, у меня есть LastPlayed
атрибут, который является DateTimeOffset
, что я хотел бы вернуться в наборе результатов запроса. В настоящее время p.As<DateTimeOffset>
работает не так, как ожидалось. Он не анализирует дату и дату возвращается как: 0001-01-01T00:00:00Z
Каков правильный способ возврата атрибутов/свойств отношений?
Проблема в том, что p
в вашем запросе является целым объектом (или сумкой), но вы не квалифицируете требуемое свойство:
LastPlayed = p.As<DateTimeOffset>()
Поскольку он не может десериализовать весь объект в DateTimeOffset
, но он не является типом NULL, вы получаете значение по умолчанию.
Вам просто нужно описать тип p
для IntelliSense:
public class PlaysPayload
{
public DateTimeOffset LastPlayed { get; set; }
}
И затем используйте это в запросе, чтобы найти нужное свойство:
.Return((l, g, p) => new {
Localized = l.As<Xbox.Localization.Game>(),
Game = g.As<Xbox.Game>(),
LastPlayed = p.As<PlaysPayload>().LastPlayed // <-- this line is different
})
Вам не нужно использовать Relationship<T>
или RelationshipInstance<T>
.
Отказ от ответственности: я печатаю это в 06:30 утра, а в аэропорту, пока они звонят на моем самолете. Я автор Neo4jClient, поэтому он должен быть правильным, но я не проверял это конкретное решение.