2013-11-29 3 views
1

У меня есть таблицы меню и данные, как прилагаемый снимок экрана Database tableудалить нулевой столбец из коллекции в C#

, и я хочу, чтобы результат, как показано ниже изображения,

http://s16.postimg.org/6evrtzkwl/output.png

означает, что все нулевые значения или целое число == 0 должны быть скрыты.

Сейчас я показываю эти 5 столбцов только, как вы можете видеть на скриншоте 2 ..

У меня есть что-то вроде этого ..

List<Menu> lstMenus = obj.GetMenus(10); 

Мой код

var menus = new List<dynamic>(); 

foreach (Menu menuBE in lstMenus) 
    { 

     dynamic menu = new 
     { 

      menuBE.MenuID, 
      menuBE.ParentMenuID, 
      menuBE.LinkText, 
      menuBE.ScreenName, 
      menuBE.Parameters, 
      menuBE.URL 
      // if(menuBE.Parameters.Length>0){ Parameters = menuBE.Parameters,} 
     }; 
     menus.Add(menu); 
    } 

, и я хочу поставить некоторое условие, подобное последней прокомментированной строке в цикле foreach. Если menuBE.Parameters.Length>0, то этот столбец параметров должен быть добавлен в динамическое меню иначе нет. Любая идея, как это можно сделать?

+0

Вы пробовали слева присоединиться на одной и той же таблицы, чтобы удалить пустые записи – liquidsnake786

+0

@ liquidsnake786: можете ли вы подсказать, как? данные, поступающие в мой lstMenus, верны. Поэтому я должен внести изменения, добавив в ** var menus ** – vishwarajmalik

+0

Что именно показывает Params? Это что-то, что может быть контроллером видимым свойством? Возможно, show menuBE и классы меню, чтобы дать лучшее понимание – James

ответ

1

То, что я понял, в противоположность Джеймса & techloverr, вы хотите сохранить записи с параметром NULL:

foreach (Menu menuBE in lstMenus){ 
    if (menuBE.Parameters.Length > 0){ 
     dynamic menu = new{ 
      menuBE.MenuID, 
      menuBE.ParentMenuID, 
      menuBE.LinkText, 
      menuBE.ScreenName, 
      menuBE.Parameters, 
      menuBE.URL 
     }; 
    } 
    else { 
     dynamic menu = new{ 
      menuBE.MenuID, 
      menuBE.ParentMenuID, 
      menuBE.LinkText, 
      menuBE.ScreenName, 
      menuBE.URL 
     }; 
    } 
    menus.Add(menu); 
} 


** ОБНОВЛЕНИЕ **

Как я понимаю в целом вопрос, вы не хотите свойство Parameters, когда исходные данные имеют Parameters.Lenght == 0, и именно поэтому вы используете динамический тип.

Это разные от «это нормально, имеет свойство« Параметры = null ». Если это подход, вам не нужно использовать динамический тип. Просто добавьте элементы в качестве элемента списка декларируемой переменной сильного типа или элемента списка анонимного типа.

С типом dynamic вы добавляете свойства во время объявления. Таким образом, вы должны разделить разные назначения как код выше. Если вы хотите положить if снаружи, чтобы избежать дублирования кода, можно использовать ExpandoObject:

var m = new List<System.Dynamic.ExpandoObject>(); 
foreach (string item in new string[] { "a", "b", "c" }) { 
    dynamic menuItem = new System.Dynamic.ExpandoObject(); 

    menuItem.pos1 = item; 
    menuItem.pos2 = (item == "b" ? item : null); // wrong 

    if (item == "c") {   // correct 
     menuItem.pos3 = "I am at third iteration"; 
    } 

    m.Add(menuItem); 
} 

Престол, если поставить точку останова на m.Add(menuItem); эти результаты:
случае пункт == «а»:

menuItem.pos1 = "a"; 
menuItem.pos2 = null; // wrong: pos2 must not exists 

случае пункт == "Ъ":

menuItem.pos1 = "b"; 
menuItem.pos2 = "b"; 

случае пункт == «с»:

menuItem.pos1 = "c"; 
menuItem.pos2 = null; // wrong: pos2 must not exists 
menuItem.pos3 = "I am at third iteration"; // correct: pos3 only exists here. 
+1

Да, я думаю, я, возможно, неправильно понял, оглядываясь на него. Не так много, что я могу сделать, чтобы улучшить то, что этот ответ дает действительно так, оставив мой как есть :) – James

+1

@andre это самое низкое качество кодирования, которое я видел – techloverr

+0

да Мне нужно что-то вроде этого, но я должен проверить около 15-20 столбцов, так что в этом случае придется поставить много, если условия .. не может я добавить, если условие внутри этого кода .. динамического меню = новый { menuBE.MenuID, menuBE.ParentMenuID, menuBE.LinkText, menuBE.ScreenName, menuBE.Parameters, menuBE.URL }; – vishwarajmalik

-1

вы можете использовать этот код

foreach (Menu menuBE in lstMenus) 
    { 

     dynamic menu = new 
     { 

      MenuID = menuBE.MenuID, 
      ParentMenuID = menuBE.ParentMenuID, 
      LinkText = menuBE.LinkText, 
      ScreenName = menuBE.ScreenName, 

      URL = menuBE.URL, 
      Parameters = (menuBE.Parameters.Length>0) ? menuBE.Parameters : null 
     }; 
     menus.Add(menu); 
    } 
+0

Какая ошибка pls, объясните – techloverr

+0

** Ошибка **: Недопустимый декларатор участника анонимного типа. Члены анонимного типа должны быть объявлены с назначением членов, простым именем или доступом к члену. – vishwarajmalik

+0

@vishwarajmalik сейчас попробуйте – techloverr