Neo4jClient - выражение типа System.Linq.Expressions.ConstantExpression не поддерживается - PullRequest
0 голосов
/ 23 января 2019

Невозможно создать объект и установить его логическое свойство внутри запроса 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 голосов
/ 28 января 2019

Извините, я пропустил это, есть другой способ, и это использовать 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.

0 голосов
/ 24 января 2019

Работа вокруг:

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