【问题标题】:Using results from Neo4j .Net driver使用 Neo4j .Net 驱动程序的结果
【发布时间】:2018-01-28 11:47:43
【问题描述】:

我正在努力将本地 Neo4j .Net 驱动程序的 INode 结果转换为我自己的对象。

public class User
{
    public String UUID { get; set; }
    public String firstname { get; set; }
}

我在 Neo4j 桌面浏览器中返回的节点:

{
  "UUID": "e0bc991a-1018-4edb-83df-771b8cee4c88",
  "firstname": "John"
}

使用 Neo4jClient 的 C# 代码(可行):

var users = client.Cypher
.Match("(p:Person)")
.Return(p => p.As<User>())
.Results.ToList();

使用原生 Neo4j .Net 驱动程序的 C# 代码(失败):

var users = new List<User>();
using (var session = _driver.Session())
{
  session.ReadTransaction(tx =>
  {
    var result = tx.Run("MATCH (p:Person) RETURN p").ToList();
    users = result.Select(p => p[0].As<User>()).ToList();
  });
}

我的错误信息是: System.InvalidCastException:无法将 Neo4j.Driver.Internal.Node 类型的对象转换为 sandbox_neotesting.Models.User 类型。

关于如何解决此问题的任何指示?我希望找到一种解决方案,可以直接将结果转换为我的内部模型,不必专门设置每个属性

谢谢! :)

【问题讨论】:

    标签: c# .net neo4j .net-core


    【解决方案1】:

    这里很安静,但找到了一个可行的解决方案。我只是序列化节点的属性,然后反序列化为用户对象。欢迎提出改进建议!

    var statementText = "MATCH (p:Person) RETURN p";
    
    var users = new List<User>();
    using (var session = _driver.Session())
    {
        session.ReadTransaction(tx =>
        {
            var result = tx.Run(statementText);
            foreach(var record in result)
            {
                var nodeProps = JsonConvert.SerializeObject(record[0].As<INode>().Properties);
                users.Add(JsonConvert.DeserializeObject<User>(nodeProps));
            }
        });
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    相关资源
    最近更新 更多