将neo4j结果返回给C#对象

将neo4j结果返回给C#对象,c#,neo4j,neo4jclient,C#,Neo4j,Neo4jclient,我有一个查询,它返回具有属性的对象列表。考虑这样的结构的C对象: public class Neo4jResult { public string Prop1 { get; set; } public string Prop2 { get; set; } public string Prop3 { get; set; } } 该查询返回一个名为“mycollection”的列,我可以将结果存储到如下位置: public async Task<IEnumerable<

我有一个查询,它返回具有属性的对象列表。考虑这样的结构的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;
}
公共异步任务MyNeo4jQuery(){ var cypher=client.cypher .Match(匹配查询) .WithParams(myParams); 密码= cypher.ReturnDistinct(“mycollection”) .OrderBy(“toLower(object.Prop1)”); var query=(IOrderedCypherFluentQuery)cypher; 返回wait query.ResultsAsync; } 这段代码运行良好。但是,我必须将该记录的计数作为另一个属性,因此我的查询现在返回两列——“mycollection”和“totalRecords”。为了实现这一点,我创建了一个新对象来反映这一点:

public class Neo4jResultNew {
   public int TotalRecords { get; set; }
   public IEnumerable<Neo4jResult> Results { get; set; }
}
公共类Neo4jResultNew{
公共整数TotalRecords{get;set;}
公共IEnumerable结果{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;
}
Results = mycollection.CollectAs<Neo4jResult>()
公共异步任务MyComplexNeo4jQuery(){
var cypher=client.cypher
.Match(匹配查询)
.WithParams(myParams);
密码=
cypher.Return((mycollection,totalRecords)=>{
{
结果=mycollection.As(),
TotalRecords=TotalRecords.As()
});
var query=(IOrderedCypherFluentQuery)cypher;
返回wait query.ResultsAsync;
}

neo4j返回的错误是:“neo4j返回了一个有效的响应,但是Neo4jClient无法反序列化到您提供的对象结构中”。我只是在线学习了这些示例,但我的投影中可能缺少一些内容?

我想问题在于您的:

Results = mycollection.As<IEnumerable<Neo4jResult>>(),
mycollection
实际上不是一个
IEnumerable
-如果在浏览器中运行查询,您可以看到它-您没有将它放在这里,因此这是一个“粗略”版本

如果您执行:

MATCH (m:Movie)
RETURN m.title, count(m)
您将获得:

Title1, 1
Title2, 1
Title3, 1
[title1, title2, title3], 3

如果您执行:

MATCH (m:Movie)
RETURN COLLECT(m.title), count(m)
您将获得:

Title1, 1
Title2, 1
Title3, 1
[title1, title2, title3], 3

例如。

这解决了问题!我在想,在引擎盖后面,它会自动将其转换为对象的IEnumerable,但它不是。