2011-10-17 28 views
0

假設我有這個類位置,它代表位置。T-Sql中的迭代和數組

public class Location 
{ 
    public int LocationID { get; set; } 
    public int JuridictionID { get; set; } 
    public int LocationName { get; set; } 
} 

例:銀泉位於蒙哥馬利縣,位於馬里蘭州,這是位於美國。因此,馬里蘭州的JuriditionID將是美國的LocationID等等。

public List<Location> SetHierarchyOfLocation(int JuridicitionID) 
{ 
     var list = new List<Location>(); 
     if (JuridicitionID > 0) 
     { 
      while (JuridicitionID > 0) 
      { 
       var location = new Location(); 
       location = GetLocationByID(JuridicitionID);      
       list.Add(location); 
       JuridicitionID = location.JuridictionID; 
      } 
     } 
     list.Reverse(); 
     return list; 
    } 

pubilc Location GetLocationByID(int LocationID) 
{ 
    return db.Locations.FirstOrDefault(l => l.LocationID == LocationID); 
} 

這很好用。但是,現在我意識到它會導致對數據庫的大量單一調用。

但我不知道如何編寫一個存儲過程將取代這一點。有人能幫我嗎???

謝謝。

+1

的SQL Server版本?你可能想看看這個問題:http://stackoverflow.com/questions/202912/hierarchical-data-in-linq-options-and-performance –

+0

sql server 2008. – Richard77

+2

你可能想'管轄權' - 注意* * S **。避免代碼中的拼寫錯誤。 http://programmers.stackexchange.com/questions/30895/should-i-point-out-spelling-grammar-related-mistakes-in-someones-code –

回答

1

我做了你們這樣一個表叫[位置]

create table location(locationid int, JuridicitionID int, placename varchar(30)) 

insert location values(1, 0, 'USA') 
insert location values(2, 1, 'Maryland') 
insert location values(3, 2, 'Silver Spring') 

go 

create procedure SetHierarchyOfLocation(@JuridicitionID int) 
as 
begin 
;with cte as 
(
select placename, JuridicitionID 
from location where JuridicitionID = @JuridicitionID 
union all 
select t.placename, t.JuridicitionID 
from cte join location t on cte.JuridicitionID = t.locationid 
) 
select placename from cte 
order by JuridicitionID 
end 

go 
exec SetHierarchyOfLocation 2 
go 
+0

當我以3作爲參數執行SPROC時,我得到了美國,馬里蘭州和蒙哥馬利縣4次。看起來答案是好的,除了我將所有東西都收入4次。 – Richard77

+0

@ Richard77我認爲你有一些腐敗的數據 –

+0

這是可能的。你可以自己添加更多的數據,以便我們可以看到上面的代碼的行爲? – Richard77