2010-08-13 2 views
5

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

DocumentClass: DocClassID, Имя, ParentID

Документ: DocID, имя, 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(); 
    } 

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

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

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

С наилучшими пожеланиями,

ОКБ

+0

не должны это возможно быть помечены как ....... штраф я сделаю это – mpen

ответ

2
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(); 
+0

Спасибо за ваш быстрый ответ! – OKB

6

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

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

Смежные вопросы