我正在使用Neo4j .Net客户端与Neo4j数据库连接。
在尝试将相关节点映射到嵌套类时,我经常遇到此问题:
例如映射
(:Foo)-[:FOOBAR]->(:Bar)
到表格
public class Foo {
public string FooPropOne { get; set; }
public string FooPropTwo { get; set; }
public List<Bar> Bars { get; set; }
}
public class Bar {
public string BarPropOne { get; set; }
public string BarPropTwo { get; set; }
}
要获得正确的反序列化输出,我必须像这样编写查询:
Foo foo = WebApiConfig.GraphClient.Cypher
.Match("(f:Foo)-[:FOOBAR]->(b:Bar)")
.With("@{
FooPropOne: f.FooPropOne,
FooPropTwo: f.FooPropTwo,
Bars: collect(b)
} AS Result")
.Return<Foo>("Result")
.SingleOrDefault();
在某种程度上,这很好,并且工作得很好,但是Foo类具有的属性越来越笨重。
我想知道在返回节点时是否可以在“With”语句中添加临时属性(在上面的情况下为“Bars”),这不需要我在每个属性上写入父节点?
像
这样的东西.With("f.Bars = collect(b)")
.Return<Foo>("f")
实际上不会影响存储在数据库中的数据吗?
提前感谢任何重拍!!
答案 0 :(得分:2)
我不知道如何添加一个像你想要的临时财产,个人 - 我会采取两种方法中的一种,而这个决定实际上取决于你喜欢做什么。
选择属性版本
var foo = client.Cypher
.Match("(f:Foo)-[:FOOBAR]->(b:Bar)")
.With("f, collect(b) as bars")
.Return((f, bars) => new Foo
{
FooPropOne = f.As<Foo>().FooPropOne,
FooPropTwo = f.As<Foo>().FooPropTwo,
Bars = Return.As<List<Bar>>("bars")
}).Results.SingleOrDefault();
此版本允许您使用您带出的对象进行“安全输入”,这在具有大量属性的类中确实会限制拼写错误的可能性。这将为您提供{{1}实例,所以不需要做任何其他处理。
一点点后处理所需的版本
Foo
这节省了输入属性,因此在大型课程中节省了时间,并且还意味着如果添加额外的属性,则不需要记住更新查询。 然而您确实需要进行一些查询后处理,例如:
var notQuiteFoo = client.Cypher
.Match("(f:Foo)-[:FOOBAR]->(b:Bar)")
.With("f, collect(b) as bars")
.Return((f, bars) => new
{
Foo = f.As<Foo>(),
Bars = bars.As<List<Bar>>()
}).Results;
就个人而言 - 我喜欢选项2 ,因为它对Typos的潜力较小,但我并不欣赏你所追求的。