2014-03-30 115 views
0

我有一個頁面,可以被多個角色的用戶訪問。該角色是:LINQ Group By with IF statement

我)鎮 II)區 三)國家

如果用戶擁有的角色「鎮」,那麼他與鎮例如關聯洛杉磯。如果用戶具有角色「區域」,則他與區域相關聯,例如,加利福尼亞。如果用戶具有'國家'角色,則他與一個國家相關,例如美國。

現在我知道洛杉磯不是一個城市,而是一座城市,加州不是一個地區,而是一個州。我只舉了這些例子來幫助你理解數據的結構。

每個角色都可以查看多個文檔。一份文件涉及一個部分,例如財務,基礎設施等

現在,我有一個SP從數據庫中獲取整個數據。然後我想用LINQ來分組數據。我想要做這樣的事情:

GROUP BY Role 
      --> GROUP BY Section 
           --> GROUP BY Document 
                --> IF ROLE is Town --> GROUP BY Town (e.g. Los Angeles) 
                --> IF ROLE is District --> GROUP BY District (e.g. California) 
                --> IF ROLE is Country --> GROUP BY Country (e.g. USA) 

是包含if語句可以使用LINQ的最後一部分?如果是的話,你可以給我一個簡短的語法例子嗎?我正在使用查詢語法。先謝謝你。

+0

您是否可以不通過三個單獨的查詢獲取數據?這會讓事情變得更簡單。 –

+0

我同意@JonSkeet。只需寫3個查詢然後結合結果。 – kevin

+0

謝謝JonSkeet和kayson。想到它,我認爲這是最好的方法。出於好奇,是否可以在LINQ中執行包含if語句的最後一部分? – Matthew

回答

1

你可以做到這與從角色繼承類(鎮,國家,州)

public enum typeRoleEnum 
{ 
    country = 0, 
    state = 1, 
    town = 2 
} 

public class Role { 
    public string name { get; set; } 
    public typeRoleEnum type { get; set; } 
} 
public class Town: Role {} 
public class District : Role { } 
public class Country : Role { } 

在角色名是爲每個類常見的,包含國家,小鎮的名字或屬性國家。只有在像這樣的財產,你會按分組。

比你創建對象的名單像這樣

List<Role> list = new List<Role>(); 

Role rol1 = new Town() { name = "Town1", type = typeRoleEnum.town }; 
Role rol2 = new Town() { name = "Town2", type = typeRoleEnum.town }; 
Role rol3 = new Town() { name = "Town2", type = typeRoleEnum.town }; 

list.Add(rol1); 
list.Add(rol2); 
list.Add(rol3); 

在這裏,你必須知道至極類型列表中,您要創建 查詢將

var t = from l in list 
    group l by l.name into grp 
select grp.Key; 

可能在這種情況下,你有一個查詢但if語句位於代碼的其他位置,必須創建列表時

您是否可以只使用具有角色類型的類?這可能是一個更好的解決方案,除非這三個類必須具有不同的行爲,並且您只希望通過公共屬性進行分組。