C# 正在强制转换未知类型的节点

C# 正在强制转换未知类型的节点,c#,neo4j,neo4jclient,C#,Neo4j,Neo4jclient,在使用Neo4j时,我能够创建带有标签的节点数组,然后在这些节点之间创建关系。这些标签本质上是映射到my POCO的(Dog标签与C#中的Dog POCO相关),这些POCO从只包含ID属性的简单基本POCO实现 当我知道要检索的节点的类型/标签时,我可以在return语句中使用node.As语法来强制转换它。但是,在执行诸如遍历节点之间的路径之类的操作时,我将不知道正在遍历的节点的类型。虽然从技术上讲,可以将节点强制转换为我的POCO实现所基于的基类型,但我丢失了超级类特有的所有属性 关于如何

在使用Neo4j时,我能够创建带有标签的节点数组,然后在这些节点之间创建关系。这些标签本质上是映射到my POCO的(Dog标签与C#中的Dog POCO相关),这些POCO从只包含ID属性的简单基本POCO实现

当我知道要检索的节点的类型/标签时,我可以在return语句中使用node.As语法来强制转换它。但是,在执行诸如遍历节点之间的路径之类的操作时,我将不知道正在遍历的节点的类型。虽然从技术上讲,可以将节点强制转换为我的POCO实现所基于的基类型,但我丢失了超级类特有的所有属性

关于如何开始这一步有什么想法吗

您可以(取决于您的感受)尝试使用dynamic,例如,您可以这样设置:

var dog = new Dog {Name = "Woofer", Breed = "Afghan Hound"};
var owner = new Person {Name = "Jeff", PhoneNumber = "01234567890"};

//CREATE
gc.Cypher.
    Create("(owner:Person {ownerParams})")
    .WithParam("ownerParams", owner)
    .With("owner")
    .Create("(owner)-[:HAS_PET]->(dog:Dog {dogParams})")
    .WithParam("dogParams", dog)
    .ExecuteWithoutResults();
并通过以下方式检索:

//RETURN
var query = gc.Cypher
    .Match("(p:Person)-[:HAS_PET]->(d:Dog)")
    .Return((p, d) => new {Person = p.As<Node<string>>(), Dog = d.As<Node<string>>()});

var results = query.Results.ToList();
foreach (var result in results)
{
    dynamic p = JsonConvert.DeserializeObject<dynamic>(result.Person.Data);
    dynamic d = JsonConvert.DeserializeObject<dynamic>(result.Dog.Data);

    Console.WriteLine("If you find {0} (a {1}) please call {2} on {3}.", d.Name, d.Breed, p.Name, p.PhoneNumber);
}
但是您在这里遇到的问题是,Neo4jClient不处理动态,实际上会将其作为
对象返回,从而丢失所有属性

这至少应该为您提供一个起点,如果您需要有关特定查询类型的帮助,则值得将查询作为参考。

您可以(取决于您的感受)尝试使用dynamic,例如,您可以这样设置:

var dog = new Dog {Name = "Woofer", Breed = "Afghan Hound"};
var owner = new Person {Name = "Jeff", PhoneNumber = "01234567890"};

//CREATE
gc.Cypher.
    Create("(owner:Person {ownerParams})")
    .WithParam("ownerParams", owner)
    .With("owner")
    .Create("(owner)-[:HAS_PET]->(dog:Dog {dogParams})")
    .WithParam("dogParams", dog)
    .ExecuteWithoutResults();
并通过以下方式检索:

//RETURN
var query = gc.Cypher
    .Match("(p:Person)-[:HAS_PET]->(d:Dog)")
    .Return((p, d) => new {Person = p.As<Node<string>>(), Dog = d.As<Node<string>>()});

var results = query.Results.ToList();
foreach (var result in results)
{
    dynamic p = JsonConvert.DeserializeObject<dynamic>(result.Person.Data);
    dynamic d = JsonConvert.DeserializeObject<dynamic>(result.Dog.Data);

    Console.WriteLine("If you find {0} (a {1}) please call {2} on {3}.", d.Name, d.Breed, p.Name, p.PhoneNumber);
}
但是您在这里遇到的问题是,Neo4jClient不处理动态,实际上会将其作为
对象返回,从而丢失所有属性


这至少应该给你一个起点,如果您需要有关特定类型查询的帮助,则值得将该查询作为参考。

如果您能提供有关您正在尝试执行的操作的更多详细信息,这将更容易提供帮助。如果您能提供有关您正在尝试执行的操作的更多详细信息,这将更容易提供帮助。谢谢Chris,这帮助我了解了如何使用模板/泛型从Neo4j动态返回任何类型的类!!我不得不对其进行大量修改,并将其分解为多个模板函数,但我最终使其正常工作。太神奇了!感谢Chris,这帮助我了解了如何使用模板/泛型从Neo4j动态返回任何类型的类!!我不得不对其进行大量修改,并将其分解为多个模板函数,但我最终使其正常工作。太神奇了!