将 Neo4j 结果返回到 C# 对象
Returning neo4j results to a C# object
我有一个查询 returns 具有属性的对象列表。考虑具有如下结构的 C# 对象:
public class Neo4jResult {
public string Prop1 { get; set; }
public string Prop2 { get; set; }
public string Prop3 { get; set; }
}
查询 returns 一个名为“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;
}
此代码运行良好。但是,我必须将这条记录的计数作为另一个 属性 所以我的查询现在 returns 两列 - “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 无法反序列化为您提供的对象结构”。我只是按照在线示例进行操作,但我的投影中可能缺少某些内容?
我认为问题出在你的身上:
Results = mycollection.As<IEnumerable<Neo4jResult>>(),
位。你真正想要的是一个 COLLECT
这样的东西:
Results = mycollection.CollectAs<Neo4jResult>()
mycollection
不是 实际上 一个 IEnumerable
- 如果你 运行 在浏览器中查询你可以看到它 - 你不要放在这里,所以这是 'rough' 版本。
如果你执行了:
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
例如。
我有一个查询 returns 具有属性的对象列表。考虑具有如下结构的 C# 对象:
public class Neo4jResult {
public string Prop1 { get; set; }
public string Prop2 { get; set; }
public string Prop3 { get; set; }
}
查询 returns 一个名为“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;
}
此代码运行良好。但是,我必须将这条记录的计数作为另一个 属性 所以我的查询现在 returns 两列 - “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 无法反序列化为您提供的对象结构”。我只是按照在线示例进行操作,但我的投影中可能缺少某些内容?
我认为问题出在你的身上:
Results = mycollection.As<IEnumerable<Neo4jResult>>(),
位。你真正想要的是一个 COLLECT
这样的东西:
Results = mycollection.CollectAs<Neo4jResult>()
mycollection
不是 实际上 一个 IEnumerable
- 如果你 运行 在浏览器中查询你可以看到它 - 你不要放在这里,所以这是 'rough' 版本。
如果你执行了:
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
例如。