Neo4jClient-不支持类型为System.Linq.Expressions.ConstantExpression的表达式

时间:2019-01-23 16:19:15

标签: c# .net neo4j neo4jclient

无法创建对象并在neo4jclient查询中设置其布尔属性。

到目前为止,我正在与neo4jclient做一个项目,效果很好。但是现在当我尝试将在查询中创建的对象的属性设置为true时,会引发此异常:

  

不支持类型为System.Linq.Expressions.ConstantExpression的表达式。

查询很简单:

            return await _graphClient.Cypher.Match("(u1:User)-[:FOLLOW]->(u2:User)")
                .Where((UserModel u1) => u1.Id == userId)
                .Return(u2 => new UserWithRelationsDto { User=u2.As<UserModel>(), IsFollow = true })
                .Limit(usersToShow)
                .ResultsAsync;

我尝试使用具有真实值的布尔变量。但会引发不同的异常:

  

不支持表达式值(DAL.Repositories.Neo4jUsersRepository + <> c__DisplayClass5_1).isFollow

var isFollow = true;
            return await _graphClient.Cypher.Match("(u1:User)-[:FOLLOW]->(u2:User)")
                .Where((UserModel u1) => u1.Id == userId)
                .Return(u2 => new UserWithRelationsDto { User=u2.As<UserModel>(), IsFollow = isFollow })
                .Limit(usersToShow)
                .ResultsAsync;

如果我将bool属性取出,则查询有效。 可能是错误?周围有工作吗?

2 个答案:

答案 0 :(得分:1)

对不起,我错过了,还有另一种方法,那就是使用With语句:

    var isFollow = false;
    await _graphClient.Cypher
        .Match("(u:User)")
        .With($"{{IsFollow:{isFollow}, User:u}} AS u2")
        .Return(u2 => u2.As<UserWithRelationsDto>())
        .ResultsAsync;

或者您可以直接使用true

    await _graphClient.Cypher
        .Match("(u:User)")
        .With($"{{IsFollow:{true}, User:u}} AS u2")
        .Return(u2 => u2.As<UserWithRelationsDto>())
        .ResultsAsync;

也许最简单的就是:

    await _graphClient.Cypher
        .Match("(u:User)")
        .With("{IsFollow:true, User:u} AS u2")
        .Return(u2 => u2.As<UserWithRelationsDto>())
        .ResultsAsync;

无论哪种方式-.With都允许您在Cypher中创建一个匿名类型,您可以将其直接解析到DTO中。

答案 1 :(得分:0)

解决方法:

return await _graphClient.Cypher.Match("(u1:User)-[r:FOLLOW]->(u2:User)")
                .Where((UserModel u1) => u1.Id == userId)
                .Return((u2,r) => new UserWithRelationsDto { User=u2.As<UserModel>(), IsFollow = r!=null})
                .Limit(usersToShow)
                .ResultsAsync;