2013-05-30 4 views
5

Ich habe eine SQL-Abfrage:eine SQL-Abfrage in LINQ zu C# Konvertieren

SELECT 
     node.GroupName 
    , depth = COUNT(parent.GroupName) - 1 
FROM CompanyGroup node 
JOIN CompanyGroup parent ON node.LeftID BETWEEN parent.LeftID AND parent.RightID 
GROUP BY node.GroupName, node.LeftID 
ORDER BY node.LeftID; 

Ich habe versucht Umwandlung, es selbst LINQ, aber ich bin mit der Sprache vertraut, nach einigen Recherchen habe ich versucht, mit Linqer, aber es wird nicht die Funktionen 'BETWEEN' oder 'COUNT' konvertieren.

Die nächstgelegene ich bisher bekommen habe ist:

 var groupModel = 
      from node in db.CompanyGroups 
      join parent in db.CompanyGroups.Where(node.LeftID > parent.LeftID && node.LeftID < parent.RightID) 
      orderby node.LeftID 
      select node.GroupName; 

, die nicht funktioniert und würde die ‚Tiefe‘ nicht zurück, auch wenn es so wäre, bitte helfen!

Edit:

die Abfrage verwendet wird, um die Tiefe von Knoten in einem verschachtelten Satz in einer Reihenfolge zurückzubringen, so dass ich eine Darstellung einer Hierarchie zu schaffen; Ich verfolge dieses Tutorial: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ auf dem Kapitel ‚Das Finden der Tiefe der Knoten‘

+0

sollten Sie '> =' und '<=' in der Linq join weil 'BETWEEN' inklusive ist –

+0

Seitliche Notiz, aber ich würde Ihre Tabellenstruktur betrachten – LukeHennerley

+1

Warum sollten Sie die Tiefe im Voraus wissen? Kannst du nicht eine verschachtelte Struktur zurückgeben und den Code, der die Schnittstelle zeichnet, einen Tiefenzähler behalten? – MrFox

Antwort

6

Sie dies sollte erhalten schließen.

Bei

 var companyGroups = new List<CompanyGroup> 
     { 
      new CompanyGroup {GroupName = "ELECTRONICS",   LeftID = 1 , RightID =20 }, 
      new CompanyGroup {GroupName = "TELEVISIONS",   LeftID = 2 , RightID =9 }, 
      new CompanyGroup {GroupName = "TUBE",     LeftID = 3 , RightID =4 }, 
      new CompanyGroup {GroupName = "LCD",     LeftID = 5 , RightID =6 }, 
      new CompanyGroup {GroupName = "PLASMA    ", LeftID = 7 , RightID =8 }, 
      new CompanyGroup {GroupName = "PORTABLE ELECTRONICS", LeftID =10 , RightID =19 }, 
      new CompanyGroup {GroupName = "MP3 PLAYERS   ", LeftID =11 , RightID =14 }, 
      new CompanyGroup {GroupName = "FLASH    ", LeftID =12 , RightID =13 }, 
      new CompanyGroup {GroupName = "CD PLAYERS   ", LeftID =15 , RightID =16 }, 
      new CompanyGroup {GroupName = "2 WAY RADIOS  ", LeftID =17 , RightID =18 }, 
     }; 

dann diese

 var results = from node in companyGroups 
         from parent in companyGroups 
         where node.LeftID >= parent.LeftID && node.RightID <= parent.RightID 
         group node by node.GroupName into g 
         orderby g.First().LeftID 
         select new { GroupName = g.Key, Depth = g.Count() - 1 }; 

ergibt

{ GroupName = ELECTRONICS, Depth = 0 } 

{ GroupName = TELEVISIONS, Depth = 1 } 

{ GroupName = TUBE, Depth = 2 } 

{ GroupName = LCD, Depth = 2 } 

{ GroupName = PLASMA    , Depth = 2 } 

{ GroupName = PORTABLE ELECTRONICS, Depth = 1 } 

{ GroupName = MP3 PLAYERS   , Depth = 2 } 

{ GroupName = FLASH    , Depth = 3 } 

{ GroupName = CD PLAYERS   , Depth = 2 } 

{ GroupName = 2 WAY RADIOS  , Depth = 2 } 
+0

nett, danke, gibt alles außer dem Wurzelknoten mit der richtigen Tiefe zurück, aber in alphabetischer Reihenfolge und nicht in der Reihenfolge von 'LeftID'. Auch sollte es sein "in db.CompanyGroups" – Jimmy

+0

@JimBarton, wenn Sie das erste Bit von wo zu sein 'where node.LeftID> = parent.LeftID' dann sollten Sie den Stammknoten –

+0

Ich habe die Antwort zu ergänzen Bestellung und der Wurzelknoten. Sie können companyGroup für db.CompanyGroups austauschen, wenn Sie müssen. – scdove

0

Sie so etwas wie hinzufügen:

group CompanyGroup by node.GroupName into g 
select new 
{ 
    node= g.GroupName, 
    left = select 
     new 
     { 

      left = 
      from CompanyGroup in g 
      group CompanyGroup by CompanyGroup. into mg 
      select new { left=mg.LeftID } 
     } 
};