Как я могу записать запись запроса в таблицу с parentID с условием parentID == 0 и ID!= (ParentID)

Здесь я запрос LINQ, чтобы получить запись в меню таблицы с условием: parentID == 0(получить корневое меню) и ID!= (Список parentID) (который является списком родительских идентификаторов, является идентификатором записи меню, имеющей child), я просто Загрузка всех записей включает в себя корневое меню, в котором нет дочерней записи и дочерней записи:

List<Menu> menus = MenuDAO.Instance.GetAll(); // Get All Record in Menu Table
var parentID = (from p in menus where p.ParentID != 0 select new {p.ParentID}).Distinct(); // Get unique ParentID in Menu Table
        List<int> numParentID = new List<int>();
        foreach (var a in parentID)
        {
            numParentID.Add(a.ParentID);
        } // assign to a list <int>
        this.ddlMenu.DataSource = from m1 in menus
                                  where !(numParentID).Contains((int)m1.ID) && m1.ParentID == 0
                                  select new { m1.ID, m1.Name };
        this.ddlMenu.Databind();

И я запускаю этот код, я отображаю записи, которые не имеют детей, не отображают записи детей. Кто-нибудь, помогите мне это исправить. Мой новый в LINQ, большое спасибо.

Результат, как я ожидаю здесь: список записей, которые не имеют дочерних элементов, моя схема таблицы меню: ID, имя, порядок, ParentID.

1 ответ

Предложения

1-Вам не нужно выбирать анонимный объект при первом выборе, вы можете написать как

var parentIDs = (from p in menus 
                 where p.ParentID != 0 
                 select p.ParentID).Distinct();

всегда хорошая практика называть коллекции множественным числом (parentIDs)

2-Нет необходимости повторять, чтобы создать new List<>Таким образом, вы можете написать все из них в одном запросе

  List<int> numParentIDs = (from p in menus 
                            where p.ParentID != 0 
                            select p.ParentID).Distinct().ToList();

Ответ: сначала выберите все идентификаторы детей уровня листа. Получить все идентификаторы, кроме значений в столбце ParentID. А затем сделайте выбор из меню, присоединившись к leafID

var leafMenuIDs = menus
                    .Select(m => m.ID)
                    .Except(menus.Select(m => m.ParentID).Distinct())                                         
                    .Distinct();


 this.ddlMenu.DataSource = from m in menus
                           join id in leafMenuIDs on m.ID equals id
                           select new { m.ID, m.Name };
Другие вопросы по тегам