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

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

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 голос
/ 30 марта 2011

Предложения

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.А затем сделайте выбор из меню, присоединившись к leafIDs

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 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...