May 31, 2009

使用Query Builder Methods做多欄位排序

有兩個table如下:

Category

SubCategory

CategorySubCategory存在Association (SubCategory.CategoryId與Category.CategoryId)

現在我們要針對SubCategory做多欄位排序,我們想先依SubCategory.CategoryId排序後,再對SubCategory.SubCategoryId做排序,該怎麼做呢?

方法1,使用Query Builder Methods + Lambda
MyAccountEntities db = new MyAccountEntities();

return db.SubCategory.Include("Category")
                     .OrderBy(c => c.Category.CategoryId)
                     .ThenBy(c => c.SubCategoryId)
                     .ToList();

方法2,使用Query Builder Methods + Entities SQL
MyAccountEntities db = new MyAccountEntities();

return db.SubCategory.Include("Category")
                     .OrderBy("it.Category.CategoryId, it.SubCategoryId")
                     .ToList();
it在這裡指的是SubCategory這個context,此為固定用法。

錯誤用法
Pete第一次研究如何做多欄排序時沒有發現有ThenBy這個好用的method,所以就下了以下的錯誤語法
MyAccountEntities db = new MyAccountEntities();

return db.SubCategory.Include("Category")
                     .OrderBy(c => c.Category.CategoryId)
                     .OrderBy(c => c.SubCategoryId)
                     .ToList();
中文語意上看起來好像也沒錯,我想先OrderBy Category.CategoryId,然後OrderBy SubCategory.SubCategoryId
這麼做也不會有錯誤訊息,但最後的結果是根據最後一個OrderBy method來排序。

May 24, 2009

Html.DropDownList的預設值沒有作用?

當在Controller內設定ViewData給View讀取時,如果ViewData的key name和View的DropDownList ID一樣時,DropDownList的預設選取功能就會失效。

例如:

Controller
ViewData["Category"] = new SelectList(repository.GetAllCategories(), "CategoryId", "CategoryName", id);

View
<%= Html.DropDownList("Category", ViewData["Category"] as SelectList)%>

各位測試後會發現沒有辦法設定DropDownList的預設值。解決方法就是不要將ViewData的key name設定成和DropDownList的ID一樣

在國外論壇上也有人提出類似問題