Список <T>LINQ Проекция на анонимный или динамический тип - PullRequest
5 голосов
/ 15 февраля 2012

Я пытаюсь преобразовать List<Topic> в анонимный или динамический тип с помощью проекции linq ... Я использую следующий код, но, похоже, он не работает должным образом. Он возвращает динамический тип без ошибок, однако, если я пытаюсь перечислить дочернее поле (list<object/topic>), то он говорит:

Просмотр результатов = тип '<>f__AnonymousType6<id,title,children>' существует как в «MyWebCore.dll», так и в «MvcExtensions.dll»

Странно.

Вот код, который я использую:

protected dynamic FlattenTopics()
{
    Func<List<Topic>, object> _Flatten = null; // satisfy recursion re-use
    _Flatten = (topList) =>
    {
        if (topList == null) return null;

        var projection = from tops in topList
                         select new
                         {
                             id = tops.Id,
                             title = tops.Name,
                             children = _Flatten(childs.Children.ToList<Topic>())
                         };
        dynamic transformed = projection;
        return transformed;
    };

    var topics = from tops in Repository.Query<Topic>().ToList()
                 select new
                 {
                     id = tops.Id,
                     title = tops.Name,
                     children = _Flatten(tops.Children.ToList<Topic>())
                 };

    return topics;
}

Все, что я делаю, это сглаживаю список самодостаточных объектов - в основном это список POCO, которые будут вставлены в древовидное представление (jstree).

Класс Topic определяется как:

public class Topic
{
    public Guid Id {get;set;}
    public string Name {get;set;}
    public List<Topic> Children {get;set;}
}

А вот пример того, как выглядит первый член возвращаемого динамического объекта:

[0] = { 
    id = {566697be-b336-42bc-9549-9feb0022f348},
    title = "AUTO", 
    children = {System.Linq.Enumerable.SelectManyIterator
          <MyWeb.Models.Topic,
           MyWeb.Models.Topic,
           <>f__AnonymousType6<System.Guid,string,object>
          >} 
 }

Ответы [ 2 ]

0 голосов
/ 26 февраля 2012

Вот правильный путь - нужно загрузить в DTO / POCO и вернуть это:

_Flatten = (topList) =>
        {
            if (topList == null) return null;

            var projection = from tops in topList
                             //from childs in tops.Children
                             select new JsTreeJsonNode
                             {
                                 //id = tops.Id.ToString(),
                                 data = tops.Name,
                                 attr = setAttributes(tops.Id.ToString(), tops.URI),
                                 state = "closed",
                                 children = _Flatten(tops.Children)
                             };


            return projection.ToList();
        };
0 голосов
/ 15 февраля 2012

Почему у вас один и тот же код LINQ дважды? После того, как вы определили свою функцию _Flatten, вы можете просто немедленно вызвать ее - var topics = _Flatten(Repository.Query<Topic>().ToList().

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

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