Я пытаюсь понять, почему neo4jClient выдает исключение, надеюсь, что кто-то здесь поможет мне лучше понять, что происходит.
прежде всего работает следующий код!!
qry = qry.Start(new
{
city = Node.ByIndexLookup(model.City.IndexName, "Label", data.RegistredAddress.City),
state = Node.ByIndexLookup(model.State.IndexName, "Label", data.RegistredAddress.State),
country = Node.ByIndexLookup(model.Country.IndexName, "Label", data.RegistredAddress.Country),
});
qry = qry.Match("(city)-[:BELONGS_TO_STATE]->(state)-[:BELONGS_TO_COUNTRY]-(country)").Return<Node<model.City>>("city");
но когда я заменяю его другой конструкцией, как показано ниже, возникает исключение
qry = qry.Start(new
{
city = Node.ByIndexLookup(model.City.IndexName, "Label", data.RegistredAddress.City),
});
qry = qry.Match("(city)-[:BELONGS_TO_STATE]->(state)-[:BELONGS_TO_COUNTRY]-(country)");
qry = qry.Where<model.State>(state => state.Label == data.RegistredAddress.State);
qry = qry.AndWhere<model.Country>(country => country.Label == data.RegistredAddress.Country);
var finalQry = qry.Return<Node<model.City>>("city");
Я получаю исключение в строке, где он пытается добавить предложение Where.
System.NotSupportedException: Unhandled node type MemberAccess in MemberExpression: value
деталь трассировки стека выглядит следующим образом
Neo4jClient.Cypher.CypherWhereExpressionVisitor.VisitMember(узел MemberExpression) в c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherWhereExpressionVisitor.cs: строка 145 System.Linq.Expressions.MemberExpression.Accept(Expression) System.Linsitor visitor Expressions.ExpressionVisitor.Visit(узел выражения) Neo4jClient.Cypher.CypherWhereExpressionVisitor.VisitBinary(узел BinaryExpression) в c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherWhereExpressionVisitor.cs: строка 65 System.Linq.Expressions Accept(посетитель ExpressionVisitor) System.Linq.Expressions.ExpressionVisitor.Visitor(узел выражения) System.Linq.Expressions.ExpressionVisitor.VisitLambda[T](Expression
1 node) System.Linq.Expressions.Expression
1.Accept(посетитель выражения ExpressionVisitor) System.Linq.Expressions.ExpressionVisitor.Visit(узел выражения ) Neo4jClient.Cypher.CypherWhereExpressionBuilder.BuildText (выражение LambdaExpression, Func2 createParameterCallback) in c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherWhereExpressionBuilder.cs: line 15 Neo4jClient.Cypher.CypherFluentQuery.<>c__DisplayClassd.<Where>b__c(QueryWriter w) in c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherFluentQuery
Where.cs: строка 11 Neo4jClient.Cypher.CypherFluentQuery .Mutate(Action1 callback) in c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherFluentQuery.cs: line 40 Neo4jClient.Cypher.CypherFluentQuery.Where(LambdaExpression expression) in c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherFluentQuery
Where.cs: строка 10 Neo4jClient.Cypher.CypherFluentQuery.Where[T1](Expression1 expression) in c:\TeamCity\buildAgent\work\f1c4cf3efbf1b05e\Neo4jClient\Cypher\CypherFluentQuery
Where.cs: строка 34
Просто любопытно узнать, в чем здесь разница и какой из двух подходов является предпочтительным способом запроса по соображениям производительности, когда работает лодка.
С уважением Киран
Where
:qry = qry.Where((Model model) => model.State.Label == data.RegistredAddress.State);
, где «Модель» — это тип вашей модели (и эквивалент дляAndWhere
) - person Charlotte Skardon   schedule 01.10.2013