FosterZ
FosterZ

Reputation: 3911

Lambda Expression for OrderBy

///  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()

I want to get all the menus in ascending order by sum of 3 fields(id,parentId,level).

or else concatenation of 2 fields(id,parentId)

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

Basically im creating a MENU Create Controller in that i have a dropdownlist that fills the all the menus, but i want to fill menus in dropdown like

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

for this i have written code below

        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);

But this doesn't give me what im expecting and i know why, in database i have table like

id   level   parent   name
---------------------------
1    0       0        Home
2    0       0        About
3    1       1        submenu1
4    1       1        submenu2
5    1       2        submenu1

i made sql query for this to get better understanding my problem

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

this query results like

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

Upvotes: 1

Views: 1192

Answers (1)

Pravin Pawar
Pravin Pawar

Reputation: 2569

Use

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()

Upvotes: 1

Related Questions