EF4.1 - рекурсивный запрос для получения иерархических данных - PullRequest
0 голосов
/ 26 июня 2011

Я придумываю это:

public partial class Forum
{
    public List<Forum> GetHierachy(Forum foru)
    {
        foreach (var forum in foru.SubForums.ToList())
        {
            yield return GetHierachy(forum);
        }
    }
}

Для этого:

public partial class Forum
{
    public int Id { get; set; }
    public int SubForumId { get; set; }

    public virtual ICollection<Forum> SubForums { get; set; }
    public virtual Forum ParentForum { get; set; }
}

И я получаю это:

The body of 'Jami.Data.Forum.GetHierachy(Jami.Data.Forum)' cannot be an iterator block because 'System.Collections.Generic.List<Jami.Data.Forum>' is not an iterator interface type:

Тогда я узнал это: Некоторая помощь в понимании "yield"

Поэтому я изменил свой метод на:

public IEnumerable<Forum> GetHierachy(Forum foru)
    {
        foreach (var forum in foru.SubForums.ToList())
        {
            yield return GetHierachy(forum);
        }
    }

И теперь я получаю пропущенное исключение приведения.

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<Jami.Data.Forum>' to 'Jami.Data.Forum'. An explicit conversion exists (are you missing a cast?)

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

Ответы [ 2 ]

4 голосов
/ 26 июня 2011

Да, он возвращает коллекцию, потому что он возвращает тип возврата вашего GetHierarchy. Итераторы не гнездятся. Вам нужно что-то вроде:

public IEnumerable<Forum> GetHierachy(Forum forum)
{
    yield forum;

    foreach (var x in forum.SubForums.SelectMany(s => GetHierarchy(s)))
    {
        yield return x;
    }
}

Когда я смотрю на этот запрос, он мне определенно не нравится. Это некрасиво и будет работать ужасно плохо, потому что для загрузки данных будет использоваться ленивая загрузка = много запросов к базе данных. Иерархические запросы должны выполняться непосредственно в базе данных с помощью общих табличных выражений.

0 голосов
/ 07 октября 2011

Взгляните на это превосходное решение для запроса иерархических данных

Может потребоваться изменение базы данных, но оно того стоит.

...