2010-04-27 26 views
1

我该怎么办代码LINQ空参数

 static string BuildMenu(List<Menu> menu, int? parentId) 
     { 
      foreach (var item in menu.Where(i => i.ParentMenu == parentId || i.ParentMenu.MenuId == parentId).ToList()) 
      { 
      } 

     } 

return BuildMenu(menuList,null); 

所以如果parentId的== null,则返回只记录我=> i.ParentMenu == NULL但当parentId的是> 0,则与我返回记录。 ParentMenu.MenuId == parentId的

+0

的ToList()是不需要的,你可以在IEnumerable的是其中()返回的迭代。 – 2010-04-27 22:47:32

回答

3

你可以做,在一个单独的语句,可能是这样的

var query = from menu in menus 
      where (parentId == null ? menu.ParentMenu == null : menu.ParentMenu != null && menu.ParentMenu.MenuId == parentId) 
      select menu; 

但我认为这将是更具可读性,打破它像下面

var query = menus.AsEnumerable(); 
if (parentId.HasValue) 
    query = query.Where(m => m.ParentMenu != null && m.ParentMenu.MenuId == parentId); 
else 
    query = query.Where(m => m.ParentMenu == null); 

完整的示例:

public class Menu 
{ 
    public Menu ParentMenu { get; set; } 
    public int MenuId { get; set; } 
} 

...

static void Main(string[] args) 
{ 
    List<Menu> menus = new List<Menu>(); 
    for (int i = 0; i < 4; i++) 
    { 
     menus.Add(new Menu() { MenuId = i }); 
    } 

    menus[2].ParentMenu = menus[0]; 
    menus[3].ParentMenu = menus[1]; 

    Console.WriteLine(BuildMenu(menus, 1)); 
    Console.Read(); 
} 

static string BuildMenu(List<Menu> menus, int? parentId) 
{ 
    var query = menus.AsEnumerable(); 
    if (parentId.HasValue) 
     query = query.Where(m => m.ParentMenu != null && m.ParentMenu.MenuId == parentId); 
    else 
     query = query.Where(m => m.ParentMenu == null); 

    StringBuilder builder = new StringBuilder(); 
    foreach (Menu menu in query) 
    { 
     // build your string 
     builder.Append(menu.MenuId + ";"); 
    } 

    return builder.ToString(); 
}