LINQ Запрос на создание непустого вложенного меню? - PullRequest
0 голосов
/ 13 марта 2009

Чтобы увидеть мою проблему в действии, посетите www.apoads.com и наведите курсор на пункт меню «Местные предприятия». Это серия вложенных неупорядоченных списков, сгенерированных из вызова db. Идите дальше и нажмите на несколько пунктов под «Местные предприятия», и вы увидите, что большинство категорий пустые (сайт очень новый).

Проблема: Я только хочу показать категории, которые на самом деле содержат местный бизнес. Вот как выглядит моя схема категории:

int BizCatID - PK,Identity (used in FK relation to the table named Biz)
int? ParentID - BizCatID of this rows parentID, null means no parent
nvarchar Name - name of the category
nvarchar Caption - quick description of the category

Что я пробовал: Я пытался обновить мой запрос LINQ так:

from c in db.BizCategories where c.ParentID != null && c.Bizs.Count() > 0 select c;

Это, очевидно, не сработает, потому что мне нужно, чтобы родительская категория показывала, содержит ли дочерняя категория бизнес. Итак, я попробовал это:

from c in db.BizCategories where c.Bizs.Count() > 0 select c;

Это также не работает, поскольку родительские категории никогда не будут иметь под ними никаких предприятий. Похоже, мне нужно выполнить какую-то обратную рекурсию, но я не уверен, как это сделать.

Или, может быть, я все усложняю для себя и мне нужно изменить свои схемы БД?

Ответы [ 3 ]

0 голосов
/ 13 марта 2009

Такой запрос приближается к тому, что мне нужно:

from c in BizCategories
    where c.ParentID == null
        select new {
            Name = c.Name, Caption = c.Caption,
            Children = 
            from d in BizCategories
            where d.ParentID == c.BizCatID && d.Bizs.Count() > 0
            select d
        }

Я должен иметь возможность выполнить еще один запрос LINQ по этим результатам и вытащить именно то, что мне нужно Не на компьютере, где я могу проверить это сейчас, но отвечу, как только смогу. Спасибо!

0 голосов
/ 13 марта 2009

создайте классы для хранения вашей информации вот так

public class BusinessCat
{
    public string Name{get;set;}
    public string Caption{get;set;}
    public List<'dunno datatype'> Children{get;set;};
}

var results = from c in BizCategories
    where c.ParentID == null
        select new BusinessCat{
            Name = c.Name,
            Caption = c.Caption,
            Children =  (from d in BizCategories
                    where d.ParentID == c.BizCatID && d.Bizs.Count() > 0 select d).ToList()
        }

и с этим у вас есть полный список детей, и вы можете просто перебрать его с помощью foreach.

Вы также можете использовать метод расширения .Join () для

where d.ParentID == c.BizCatID && d.Bizs.Count()
0 голосов
/ 13 марта 2009

Я не уверен насчет рекурсии, но это может помочь вам начать Это двухуровневый запрос. Я предполагаю, что вы хотите поддерживать любое количество уровней.

var allcats = (from c in db. BizCategories
               select c).ToList(); // This will retrieve them all from the database.

var twoLevels = from c in allcats
                where c.ParentID == null
                select new {
                             Name = c.Name, Caption = c.Caption,
                             Children = 
                             from d in allcats 
                             where d.ParentID == c.BizCatID
                             select d
                           };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...