Linq語句問題的解決方法
學習Linq時,經常會遇到Linq語句問題,這里將介紹Linq語句問題的解決方法。
Navigation 類提供取得指定 Url 權限的功能,使用基本的Linq語句:
- public static int GetPermission(string Url)
- {
- var item = Links.Where(p => p.Url == Url).ToList();
- if (item.Count > 0)
- {
- return item[0].Permission;
- }
- return 0;
- }
因為,在生成 html 的時候,考慮了如果按照相應的權限,一個分類下沒有任何項目,則不顯示這個分類,所以,取 Index 要復雜一些,要根據相應的權限進行分組,所以相應的Linq語句也復雜一些,使用了 group by:
- public static int GetIndex(string Url, int Permission)
- {
- int id = FindCategoryId(Url);
- var item = from p in Links where (p.Permission & Permission) ==
Permission && p.Category_Id != 0- group p by p.Category_Id into g select new { Category_Id = g.Key };
- var i = item.ToList().FindIndex(p => p.Category_Id == id);
- return i < 0 ? 0 : i;
- }
- public static int FindCategoryId(string Url)
- {
- var item = Links.Where(p => p.Url == Url).ToList();
- if (item.Count > 0)
- {
- return item[0].Category_Id;
- }
- return 0;
- }
雖然我現在使用的是內存里的數據,不過,因為格式是很標準的數據庫格式,所以,要把這個配置項放入數據庫表里,或者序列化成 XML,也都是非常方便的 —— 雖然我認為這個必要性不高。
從實現來看,這個方法的速度應該不會很快,不過,因為數據量小,而且對于頁面來說,這些在內存里做的手腳只能算小Case,所以沒有明顯感覺速度上有任何差異。
不過,目前對于這個方案,還有一些不滿意,比如,Hide 參數考慮改成和 Permission 相似,則可以控制每一項在不同權限下的顯示,比單純的全局 Hide 要靈活得多。再比如,目前沒有判斷是否會出現兩條分割線等等。
另外一種實現方案是,把數據的定義放在每一個頁面里,這樣的話,雖然設置分散到了每一個頁面,但是卻更符合實際情況,而且,頁面 Url 也可以通過反射得到,刪除頁面或者頁面改名都更簡單,也許是更好的解決方案吧。以上介紹Linq語句。
【編輯推薦】