【问题标题】:Returning neo4j results to a C# object将 neo4j 结果返回到 C# 对象
【发布时间】:2021-01-29 22:20:49
【问题描述】:

我有一个返回带有属性的对象列表的查询。考虑一个具有类似结构的 C# 对象:

public class Neo4jResult {
   public string Prop1 { get; set; }
   public string Prop2 { get; set; }
   public string Prop3 { get; set; }
}

查询返回一个名为“mycollection”的列,我可以将结果存储到如下内容:

public async Task<IEnumerable<Neo4jResult>> MyNeo4jQuery() {
   var cypher = client.Cypher
      .Match(matchQuery)
      .WithParams(myParams);

   cypher =
      cypher.ReturnDistinct<Neo4jResult>("mycollection")
      .OrderBy("toLower(object.Prop1)");

   var query = (IOrderedCypherFluentQuery<Neo4jResult>)cypher;

   return await query.ResultsAsync;
}

此代码运行良好。但是,我必须将此记录的计数作为另一个属性,因此我的查询现在返回两列 - “mycollection”和“totalRecords”。为了促进这一点,我创建了一个反映这一点的新对象:

public class Neo4jResultNew {
   public int TotalRecords { get; set; }
   public IEnumerable<Neo4jResult> Results { get; set; }
}

然后我将我的 neo4j 查询更改为:

public async Task<IEnumerable<Neo4jResult>> MyComplexNeo4jQuery() {
   var cypher = client.Cypher
      .Match(matchQuery)
      .WithParams(myParams);

   cypher =
      cypher.Return<Neo4jResultNew>( (mycollection, totalRecords) => {
      {
         Results = mycollection.As<IEnumerable<Neo4jResult>>(),
         TotalRecords = totalRecords.As<int>()
      });

   var query = (IOrderedCypherFluentQuery<Neo4jResultNew>)cypher;

   return await query.ResultsAsync;
}

neo4j 返回的错误是:“Neo4j 返回了一个有效的响应,但是 Neo4jClient 无法反序列化为您提供的对象结构”。我只是按照在线示例进行操作,但我的投影中可能缺少一些东西?

【问题讨论】:

    标签: c# neo4j neo4jclient


    【解决方案1】:

    我认为问题出在你身上:

    Results = mycollection.As<IEnumerable<Neo4jResult>>(),
    

    位。你真正想要的是COLLECT,比如:

    Results = mycollection.CollectAs<Neo4jResult>()
    

    mycollection 不是实际上 IEnumerable - 如果你在浏览器中运行查询,你可以看到它 - 你没有把它放在这里,所以这是一个“粗略” '版本。

    如果你执行了:

    MATCH (m:Movie)
    RETURN m.title, count(m)
    

    你会得到:

    Title1, 1
    Title2, 1
    Title3, 1
    

    如果你执行:

    MATCH (m:Movie)
    RETURN COLLECT(m.title), count(m)
    

    你会得到:

    [title1, title2, title3], 3
    

    例如。

    【讨论】:

    • 这解决了问题!我在想,在幕后,它会自动将其转换为对象的 IEnumerable 但它不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多