Ошибка с явным преобразованием при использовании CollectAs‹›

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

return client.Cypher
            .Match("(person:Person)")
            .Where((Person person) => person.Email == username)
            .OptionalMatch("(person)-[:SPEAKS]-(language:Language)")
            .OptionalMatch("(person)-[:CURRENT_LOCATION]-(country:Country)"
            .Return((person, language, country) => new ProfileObject
            {
                Person = person.As<Person>(),
                Language = language.CollectAs<Language>(),
                Country = country.CollectAs<Country>()
            }).Results.ToList();

Мне это кажется правильным, но это не так, при сборке я получаю эту ошибку, которую я понимаю, но не могу решить.

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<Neo4jClient.Node<Graph.Country>>' to 'Graph.Country'. An explicit conversion exists (are you missing a cast?)

Языковой класс выглядит так

public class Language
{
    public string Name { get; set; }
}

И класс ProfileObject выглядит так:

public class ProfileObject
{
    public Person Person { get; set; }
    public Language Language { get; set; }
    public Country Country { get; set; }
}

Я действительно застрял, пожалуйста, помогите.


person Shaine Fisher    schedule 22.07.2015    source источник


Ответы (1)


CollectAs возвращает набор узлов.

Вам нужно изменить ProfileObject на:

public class ProfileObject
{
    public Person Person { get; set; }
    public IEnumerable<Node<Language>> Language { get; set; }
    public IEnumerable<Node<Country>> Country { get; set; }
}

В грядущем обновлении пакета обертка Node<T> была удалена из подписи, так что будет просто:

public class ProfileObject
{
    public Person Person { get; set; }
    public IEnumerable<Language> Language { get; set; }
    public IEnumerable<Country> Country { get; set; }
}

Если вы хотите получить более чистую подпись сейчас, ознакомьтесь с предварительными пакетами на NuGet (https://www.nuget.org/packages/Neo4jClient/1.1.0-Tx00009).

person Tatham Oddie    schedule 22.07.2015
comment
Хотя это действительно решило проблему, заданную в вопросе, это вызвало еще один вопрос. Этот метод вызывается через веб-сервис, дополнительный IEnumerable‹Node‹Country›› выдает ошибку. Невозможно сериализовать, потому что Country - это интерфейс, какие-нибудь действительно хорошие предложения для этого? - person Shaine Fisher; 25.07.2015
comment
Кажется, я наткнулся на ограничение или ментальный блок в этом потоке (stackoverflow.com/questions/31630614/) резюмирует, где что-то идет не так. Мы нашли способ сериализовать результат, но получаем ошибку «Neo4jClient.Node`1[Graph.Language] не может быть сериализован, поскольку у него нет конструктора без параметров». и ошибка похоже заключается в том, что Neo4jClient.Node не имеет параметров и не может быть таким. - person Shaine Fisher; 26.07.2015
comment
И если кто-нибудь найдет этот поток с похожей проблемой, ответ Татема выше блестящий, но если после этого вы получите ошибки сериализации, то этот поток: stackoverflow.com/questions/31630614/ может заполнить остальную часть решения . Отличная работа этих людей, на самом деле. - person Shaine Fisher; 26.07.2015