4

我有一个 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;

已成功连接到 Neo4jgraph的在哪里。IGraphClient

我收到的错误是...

查询响应包含列 User, University 然而 <>f__AnonymousType0`2[[XYZ.Entities.User, XYZ.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[XYZ.Entities.University, XYZ.实体,版本=1.0.0.0,文化=中性,PublicKeyToken=null]] 不包含可公开设置的属性来接收此数据。

因此,总而言之,如果有人可以为我提供一种从密码查询中获取对象的方法,该查询使用 Neo4jClient 返回多个列,我将非常感激!

4

2 回答 2

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;
}

请注意,虚拟聚合类型中的属性名称区分大小写;它们必须与您在密码RETURN子句中使用的名称精确匹配。

这显然是愚蠢的,但这是唯一对我有用的东西;我尝试了从元组到dynamic关键字的所有内容。

于 2013-02-15T21:19:40.220 回答
1

匿名类型从 1.0.0.514 开始工作。

升级,您的问题中显示的查询将按书面方式工作。

于 2013-04-02T13:29:04.720 回答