我有以下Neo4jClient流畅的API查询,用于返回存储在我的Neo4j数据库中的Xbox游戏的本地化文本:
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
返回关系属性/属性的正确方法是什么?
答案 0 :(得分:2)
问题是您的查询中的p
是一个完整的对象(或包),但您没有符合所需的属性:
LastPlayed = p.As<DateTimeOffset>()
因为它无法将整个对象反序列化为DateTimeOffset
,但它不是可以为空的类型,所以您将获得默认值。
您只需要为了IntelliSense而描述p
的类型:
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>
。
免责声明:我正在早上6点30分在机场打电话,而他们正在打电话给我的飞机。我是Neo4jClient的作者,所以它应该是正确的,但我还没有验证这个特定的解决方案。