2009-03-13 8 views
0

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

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

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; 

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

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

ответ

0

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

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() 
     } 

и с этим у вас есть список, полные дети, и вы можете просто итерацию через него с Еогеаспом.

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

where d.ParentID == c.BizCatID && d.Bizs.Count() 
+0

Это уже класс, от LINQ до Sql. Полагаю, я мог бы добавить свойство «Дети» через добавление частичного класса. Ваше решение выглядит практичным, я расскажу о том, как это работает для меня. Спасибо! – Chaddeus

+0

После того, как вы поехали, вы правы. Я был WAAAAY чрезмерно мыслящими вещами. Так просто, следовало бы это увидеть раньше. Спасибо! – Chaddeus

0

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

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 
          }; 
+0

Это заставляет меня думать ... прочь к fireup LINQPad и запустить несколько запросов ... Спасибо! – Chaddeus

0

Запрос, как это уже близко к тому, что мне нужно:

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 над этими результатами и вытаскивать именно то, что мне нужно. Не на компьютере, где я могу проверить это сейчас, но отвечу, как только смогу. Благодаря!

Смежные вопросы