2010-08-13 7 views
5

Ich habe 2 Tabellen (Dokument und Document), die die folgenden Spalten:LINQ und wie eine Liste eines bestimmten Typs zurück

Document: DocClassID, Name ParentID

Dokument: DocID, Namens-, DocClassID

Die Tabelle DocumentClass enthält übergeordnete und untergeordnete Datensätze und die Beziehung zwischen einem übergeordneten Element und einem untergeordneten Element ist die ParentID-Spalte. Ein Document Datensatz ist mit einem untergeordneten Datensatz in der DocumentClass durch den Fremdschlüssel DocClassID verknüpft.

Eltern Aufzeichnungen in DocumentClass haben ParentID = 0 und Kinder Datensätze in der DocumentClass ParentID haben! = 0

ich ein Kinder Namen abrufen möchten, und dass Eltern des Kindes Namen aus der DocumentClass Tabelle.

Ich habe es geschafft, eine Funktion zu erstellen, die das für mich erledigt. Ich sende eine Liste von Dokument-IDs ein, finde die DocumentClass Datensätze (die untergeordneten Datensätze), mit denen das Dokument verknüpft ist, und finde dann die übergeordneten Elemente zu diesen untergeordneten Datensätzen. Dann lege ich diese Information in eine Kinderklasse.

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(); 
    } 

Mein Problem ist, dass ich eine Liste zurückzukehren, von der Funktion haben will, aber der Compiler dies nicht bei allen. Ich bekomme eine Fehlermeldung, die besagt, dass

System.Collections.Generic.List``<AnonymousType#1>System.Collection.Generic.List<Child> nicht implizit konvertieren kann.

Wie kann ich diese LINQ-Abfrage schreiben, um eine Liste zurückzugeben?

Mit freundlichen Grüßen,

OKB

+0

shouldnt sagen, dass dies vielleicht als markiert werden ....... gut ich werde es tun – mpen

Antwort

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

Vielen Dank für Ihre schnelle Antwort! – OKB

6

result ist eine Liste von anonymen Typen, die jeweils mit einem Element (children), die eine zählbare Menge von Child Aufzeichnungen ist. Sie sollten in der Lage sein Select verwenden hier:

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

oder (identisch):

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

Sie einen anonymen Typ zurückkehrt, wenn Sie select new { children ...

Verwandte Themen