在Neo4jClient查询结果中处理多个列

时间:2013-02-15 13:07:30

标签: c# cypher neo4jclient

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

其中graphIGraphClient,已成功连接到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返回多个列,我将非常感激!

2 个答案:

答案 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起开始工作。

升级,问题中显示的查询将按照书面形式运作。