2013-05-30 15 views
5

Mam zapytanie SQL:Konwersja zapytanie SQL do LINQ w C#

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; 

próbowałam przekształcenie go do siebie LINQ, ale jestem zaznajomiony z językiem, po pewnym badań Próbowałam używając Linqer, ale nie konwertuje funkcji "MIĘDZY" lub "COUNT".

Najbliżej stałam tak daleko jest:

 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; 

który nie działa i nie zwróci „głębokość” nawet gdyby tak się stało, prosimy o pomoc!

Edycja:

Zapytanie jest używana do zwrócenia głębokość węzłów zagnieżdżonej zestawu w kolejności tak, aby utworzyć odwzorowanie hierarchii; Obserwuję ten tutorial: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ w rozdziale „Znajdowanie głębokości węzły”

+0

należy użyć '> =' i '<=' w LINQ dołączyć ponieważ 'BETWEEN' jest włącznie –

+0

Notatka boczna, ale powinienem wziąć pod uwagę strukturę twojej tabeli – LukeHennerley

+1

Dlaczego musisz znać głębokość z góry? Nie możesz zwrócić struktury zagnieżdżonej i pozwolić kodowi rysującemu interfejs zachować licznik głębokości? – MrFox

Odpowiedz

6

Ten powinien dostać zamknięciu.

Biorąc

 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 }, 
     }; 

wówczas

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

daje

{ 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

nice, thanks, zwraca wszystko oprócz węzła głównego z poprawną głębią, ale w kolejności alfabetycznej, a nie w kolejności "LeftID". Również powinno być "w db.CompanyGroups" – Jimmy

+0

@JimBarton, jeśli zmienisz pierwszy bit gdzie być 'gdzie node.LeftID> = parent.LeftID', powinieneś uzyskać węzeł główny –

+0

Zmieniono odpowiedź, aby dodać porządkowanie i węzeł główny. Jeśli chcesz, możesz zamienić companyGroup na db.CompanyGroups. – scdove

0

trzeba dodać coś takiego:

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