OrderBy的Lambda表达式

时间:2012-04-20 09:30:02

标签: asp.net-mvc linq lambda

///  Model
public class MenuModels
{
    public Int32 MenuId { get; set; }
    public string MenuName { get; set; }
    public Int32 MenuLevel { get; set; }
    public Int32 MenuParent { get; set; }
    public string MenuUrl { get; set; }
}

///    In my Controller I have this code
Menus = menuRepository.GetAll().OrderBy(y=>y.menu_id+y.menu_parent+y.menu_level).ToList()

我想通过3个字段(id,parentId,level)的总和按升序获取所有菜单。

或者2个字段(id,parentId)的连接

menuRepository.GetAll().OrderBy(y=>int.parse(y.menu_id.ToString+y.menu_parent.ToString)).ToList()

我基本上创建一个菜单创建控制器,我有一个下拉列表,填充所有菜单,但我想填写下拉菜单

Home
--submenu1
--submenu2
Contact
--submenu1
--submenu2

为此我编写了以下代码

        var menuModel = new MenuModels()
        {
            Menus = menuRepository.GetAll().ToList().Select(x =>
                           {
                               var level = x.menu_level;
                               return (level == 0)
                                          ? new SelectListItem {Text = x.menu_name, Value = x.menu_id.ToString()}
                                          : new SelectListItem {Text = "-- "+x.menu_name, Value = x.menu_id.ToString()};
                           })
         };
        return View(menuModel);

但这并没有给我什么期待,我知道为什么, 在数据库中我有像

这样的表
id   level   parent   name
---------------------------
1    0       0        Home
2    0       0        About
3    1       1        submenu1
4    1       1        submenu2
5    1       2        submenu1

我为此做了sql查询以更好地理解我的问题

select *,( Convert(nvarchar(50),(case when menu_parent=0 then menu_id else menu_parent end))  + '' +  Convert(nvarchar (50),(menu_parent)))
 as Sort from menu order by Sort,menu_id

此查询结果如

id   level   parent   name      Sort
------------------------------------
1    0       0        Home       10
3    1       1        submenu1   11
4    1       1        submenu2   11
2    0       0        Abount     20
5    1       2        submenu1   22

1 个答案:

答案 0 :(得分:1)

使用

menuRepository.GetAll().
        select(y= new MenuDatastructure() 
        {
            //rest of the properties like menuid,menuName etc,
            sortColumn = //concat the fields to get sort column like 10,11,11,20,22
        }
        ).OrderBy(y=>y.sortColumn).ToList()