LINQ и как вернуть список определенного типа - PullRequest
5 голосов
/ 13 августа 2010

У меня есть 2 таблицы (Document и DocumentClass), которые имеют следующие столбцы:

DocumentClass: DocClassID, Name, ParentID

Документ: DocID, Name, DocClassID

Таблица DocumentClass содержит родительские и дочерние записи, а отношения между родителем и дочерним элементом - это столбец ParentID.Запись Document связана с дочерней записью в DocumentClass внешним ключом DocClassID.

Родительские записи в DocumentClass имеют ParentID = 0, а дочерние записи в DocumentClass имеют ParentID! =0

Я хочу получить имя ребенка и имя родителя этого ребенка из таблицы DocumentClass.

Мне удалось создать функцию, которая сделает это за меня.Я отправляю список идентификаторов документов, нахожу те записи DocumentClass (дочерние записи), с которыми связан документ, а затем нахожу родителя для этих дочерних записей.Затем я помещаю эту информацию в класс Child.

public List<Child> GetDocClassInfo(List<int> docIds)
{
var result = from dc in _context.DocClasses
             from d in _context.Documents
             where dc.DocClassID == d.DocClassID
             where dc.DocClassID != 0
             where docIds.Contains(d.DocID)
             select new 
             {
                 children = from p in _context.DocClasses
                            where dc.ParentID == p.DocClassID
                            select new Child
                            {
                                ChildId = dc.DocClassID,
                                ChildDocClassName = dc.DocClassName,
                                ParentId = p.DocClassID,
                                ParentDocClassName = p.DocClassName
                            }
             };

        return result.ToList();
    }

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

Невозможно неявно преобразовать тип System.Collections.Generic.List``<AnonymousType#1> в System.Collection.Generic.List<Child>.

Как мне написать этот запрос LINQ для возврата списка?

С уважением,

OKB

Ответы [ 3 ]

6 голосов
/ 13 августа 2010

result - это список анонимных типов, каждый из которых имеет член (children), представляющий собой перечисляемый набор Child записей.Вы должны иметь возможность использовать SelectMany здесь:

var list = (from item in result
            from child in item.children
            select child).ToList();

или (идентично):

var list = result.SelectMany(item => item.children).ToList();
3 голосов
/ 13 августа 2010

Вы возвращаете анонимный тип, когда говорите select new { children ...

2 голосов
/ 13 августа 2010
var result = (from dc in _context.DocClasses
             join d in _context.Documents
             on dc.DocClassID equals d.DocClassID
             where dc.DocClassID != 0 && docIds.Contains(d.DocID)
             let children = from p in _context.DocClasses
                            where dc.ParentID == p.DocClassID
                            select new Child {
                                              ChildId = dc.DocClassID,
                                              ChildDocClassName = dc.DocClassName,
                                              ParentId = p.DocClassID,
                                              ParentDocClassName = p.DocClassName
                                              }
              select children).SelectMany(c=>c).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...