我有一个Neo4j数据库,为了简单起见,它包含用户节点和大学节点 - 用户可以通过[:STUDENT_AT]关系与大学相关联。
我想返回特定用户的用户详细信息和大学详细信息,在这种情况下通过“用户名”值查询。
查询本身工作正常,但我无法找到正确的方法来获取Neo4jClient中的反序列化器,以便为我提供两个对象。以下是我认为应该起作用的,但是 - 唉 - 事实并非如此。
graph.Cypher
.Start("user", "node(*)")
.Match("user-[:STUDENT_AT]->university")
.Where<User>(user =>
user.Username != null &&
user.Username.ToLower() == username.ToLower())
.Return((user, university) => new
{
User = user.As<User>(),
University = university.As<University>()
})
.Results;
其中graph
是IGraphClient
,已成功连接到Neo4j。
我收到的错误是......
查询响应包含User,University列 &lt;&gt; f__AnonymousType0`2 [[XYZ.Entities.User,XYZ.Entities,Version = 1.0.0.0, Culture = neutral,PublicKeyToken = null],[XYZ.Entities.University,XYZ.Entities, Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]不包含公开 用于接收此数据的可设置属性。
总而言之,如果有人能为我提供一个从密码查询中获取对象的方法,该查询使用Neo4jClient返回多个列,我将非常感激!
答案 0 :(得分:2)
我能够让它工作的唯一方法是实际声明一个类型,它是我需要的多个列的集合。因此,例如,您需要声明包含User属性和University属性的虚拟类型。在您的情况下,您可以尝试:
private class UserAndUniversity {
public User User {get; set;}
public University University {get; set;}
}
public object MyMethod()
{
graph.Cypher
.Start("user", "node(*)")
.Match("user-[:STUDENT_AT]->university")
.Where<User>(user =>
user.Username != null &&
user.Username.ToLower() == username.ToLower())
.Return((user, university) => new UserAndUniversity
{
User = user.As<User>(),
University = university.As<University>()
})
.Results;
}
请注意,虚拟聚合类型中的属性名称区分大小写;它们必须与您在cypher RETURN
子句中使用的名称精确匹配。
这显然是愚蠢的,但它是唯一对我有用的东西;我尝试了从元组到dynamic
关键字的所有内容。
答案 1 :(得分:1)
匿名类型从1.0.0.514起开始工作。
升级,问题中显示的查询将按照书面形式运作。