2010-08-13 32 views
5

Tengo 2 tablas (Documento y documentclass) que tienen las siguientes columnas:LINQ y cómo devolver una lista de un tipo específico

documentclass: DocClassID, nombre, ParentID

documento: DocID, nombre, DocClassID

La tabla DocumentClass contiene registros principales y secundarios, y la relación entre un elemento primario y un elemento secundario es la columna ParentID. Un registro Document está vinculado con un registro secundario en el DocumentClass mediante la clave foránea DocClassID.

registros primarios en DocumentClass tener ParentID = 0 y registros secundarios en la DocumentClass han ParentID! = 0

Quiero recuperar un nombre del niño y el nombre de los padres de ese niño de la mesa DocumentClass.

He logrado crear una función que hace eso por mí. Envío una lista de ID de documento, encuentre los registros DocumentClass (los registros secundarios) a los que está vinculado el documento y luego encuentre el padre en esos registros secundarios. Luego coloco esa información que quiero en una clase 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(); 
    } 

Mi problema es que quiero tener una lista para volver a la función, pero el compilador no le gusta en absoluto. Me sale un error al decir que

No se puede convertir implícitamente el tipo System.Collections.Generic.List``<AnonymousType#1> en System.Collection.Generic.List<Child>.

¿Cómo puedo escribir esa consulta LINQ para devolver una lista?

Saludos,

OKB

+0

shouldnt esto quizás se etiquetará como ....... bien lo haré – mpen

Respuesta

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

¡Gracias por su rápida respuesta! – OKB

6

result es una lista de los tipos anónimos, cada uno con un miembro (children) que es un conjunto numerable de Child registros. Usted debe ser capaz de utilizar SelectMany aquí:

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

o (idénticos):

var list = result.SelectMany(item => item.children).ToList(); 
3

va a devolver un tipo anónimo cuando se dice select new { children ...

Cuestiones relacionadas