Невозможно неявно преобразовать тип из System.Collection.Generic.IEnumerable.MyClass‹Node› в MyClass‹Node›

Ниже приведен код, для которого генерируется ошибка:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Neo4jClient;
using Neo4jClient.Cypher;

namespace ConsoleApplication1
{   
    public class SNode
    {
        public int shelfid { get; set; }
        public int floorid { get; set; }
    }

    public class PathsResult<TNode>
    {
        public IEnumerable<Node<TNode>> Nodes { get; set; }
        public IEnumerable<RelationshipInstance<object>> Relationships { get; set; }
    }

    class Program
    {
        public static PathsResult<SNode> getPath(int sourceShelfId, int destinationShelfId, GraphClient client)
        {
            var pathsQuery =
            client.Cypher
                .Match("p = shortestPath((src:Node)-[*..150]-(dest:Point))")
                .Where((SNode src) => src.shelfid == sourceShelfId)
                .AndWhere((SNode dest) => dest.shelfid == destinationShelfId)
                .Return(p => new PathsResult<SNode>
                {
                    Nodes = Return.As<IEnumerable<Node<SNode>>>("nodes(p)"),
                    Relationships = Return.As<IEnumerable<RelationshipInstance<object>>>("rels(p)")
                });

            var res = pathsQuery.Results;
            return res;
        }
    }
}

Ошибка, которую я получаю, заключается в следующем:

Cannot implicitly convert type System.Collection.Generic.IEnumerable<ConsoleApplication1.PathResult<ConsoleApplication1.SNode> > 
to ConsoleApplication1.PathResult<ConsoleApplication1.SNode> >. An explicit conversion exists, are you missing a cast?

Насколько я понимаю, pathQuery.result должен возвращать один объект PathResult. Однако я попытался сделать приведение по приведенной выше ошибке следующим образом:

var res = pathsQuery.Results.AsEnumerable<PathsResult<SNode> >;

И теперь новая ошибка, которую он дает:

Невозможно назначить группу методов неявно типизированной локальной переменной

Где я ошибаюсь?


person Nitin Labhishetty    schedule 10.06.2015    source источник
comment
Скобки не забыл? var res = pathsQuery.Results.AsEnumerable‹PathsResult‹SNode››();   -  person Kevin D    schedule 10.06.2015
comment
да, он не поставил скобки метода   -  person Ehsan Sajjad    schedule 10.06.2015
comment
Ошибка говорит о том, что вы пытаетесь преобразовать IEnumerable<X> в X. Итак, вам нужно сделать что-то вроде .First(), где вы делаете это. Поскольку вы не указали полную ошибку и не сказали нам, где это происходит, мы мало что можем сделать.   -  person poke    schedule 10.06.2015
comment
@poke: это полная ошибка и полная программа. Я попытался добавить скобки и теперь получаю предыдущую ошибку.   -  person Nitin Labhishetty    schedule 10.06.2015


Ответы (1)


У вас есть несколько возможностей:

  1. изменить тип возвращаемого значения getPath на IEnumerable...
  2. Используйте только первый элемент результата запроса: добавьте .FirstOrDefault()

    var res = pathsQuery.Results.FirstOrDefault();
    

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

person DrKoch    schedule 10.06.2015
comment
Спасибо, это устранило ошибку, не подумал об использовании FirstOrDefault(). Просто любопытно, если бы я должен был сделать приведение для устранения этой ошибки, как бы я это сделал? - person Nitin Labhishetty; 10.06.2015