2013-12-06 3 views
0

шифровальщиком вики Neop4jClient (https://github.com/Readify/Neo4jClient/wiki/cypher) содержит пример использования лямбда-выражения для возврата нескольких проекций ...Возвращение составного класса с Neo4jClient

var query = client 
.Cypher 
.Start(new { root = client.RootNode }) 
.Match("root-[:HAS_BOOK]->book-[:PUBLISHED_BY]->publisher") 
.Return((book, publisher) => new { 
    Book = book.As<Book>(), 
    Publisher = publisher.As<Publisher>(), 
}); 

Таким образом, запрос будет возвращать детали как книги узлов и издатель узлов. Но я хочу сделать что-то немного другое. Я хочу объединить содержимое одного типа узла с свойством согласованного пути. Допустим, у меня есть Person узлы с «именем» собственности, и класс, определенный так ,,,

public class descendant 
{ 
    public string name { get; set; } 
    public int depth { get; set; } 
} 

высчитывать запрос, как это будет вернуть то, что я хочу, что все потомки данного узла с глубиной отношений ...

match p=(n:Person)<-[*]-(child:Person) 
where n.name='George' 
return distinct child.name as name, length(p) as depth 

Если я пытаюсь Neo4jClient запрос, как это ...

var query = 
    _graphClient.Cypher 
      .Match("p=(n:Person)<-[*]-(child:Person)") 
      .Where("n.name='George'") 
      .Return<descendant>("child.name, length(p)") ; 

Я получаю сообщение об ошибке, что синтаксис является устаревшим, но я не могу понять, как следует Я проецирую cypher resu lts на мой C# POCO. Какие-нибудь идеи?

ответ

0

запрос должен выглядеть следующим образом:

var query = 
    _graphClient.Cypher 
     .Match("p=(n:Person)<-[*]-(child:Person)") 
     .Where((Person n) => n.name == "George") 
     .Return((n,p) => new descendant 
     { 
      name = n.As<Person>().Name, 
      depth = p.Length() 
     }); 

Return оператор должен иметь 2 параметра вы заботитесь о (в данном случае n и p) и проецировать их с помощью синтаксиса лямбда (=>) для создания новый descendant экземпляр. Главное отличие этого от примера состоит в том, что в примере создается новый анонимный тип, тогда как вы хотите создать конкретный тип.

Затем мы используем инициализатор свойств (код внутри скобок { }), чтобы задать имя и глубину, используя методы расширения As<> и Length, чтобы получить нужные значения.

Как примечание стороны, я также изменил положение Where использовать параметры, вы должны всегда это делать, если вы можете, это сделает ваши запросы быстрее и безопаснее.

+0

Спасибо, что сработало удовольствие. Особенно после обновления до последней версии Neo4jClient.dll! Я использую параметры в своем коде проекта - я просто упростил некоторые вещи, чтобы подать пример. –

+0

Ах круто - просто хотел убедиться! :) –

Смежные вопросы