Как выбрать Список родителей и всех его детей из анонимного списка - PullRequest
0 голосов
/ 01 февраля 2012

Мои заявления Linq2Sql дают мне то, что я требовал. Ниже мой метод, возвращающий анонимный список категорий и всех связанных с ними подкатегорий:

public IQueryable GetAllCategoriesAndSubcategories()
{
    return from p in _context.Categories
    let relatedchilds = from c in _context.SubCategories
                        where c.CategoryId == p.Id
                        select c
                        select new
                               {
                                  p,
                                  relatedchilds
                               };
}

В своем коде я использую этот метод для получения категории и всех ее подкатегорий:

 private void WriteCategories()
        {
            var repository = new CategoryRepository();
            var dt = repository.GetAllCategoriesAndSubcategories();
            var sb = new StringBuilder();
            sb.AppendLine(" <div class='widget_box' id='category'>");
            sb.AppendLine("     <div class='wintitle'>");
            sb.AppendLine("         <div class='inner_wintitle'>Categories</div>");
            sb.AppendLine("     </div>");
            sb.AppendLine("     <div class='winbody'>");
            sb.AppendLine("         <ul class='categories'>");
            int i = 1;
            foreach (Category category in dt.OfType<Category>())
            {
                sb.AppendLine(
                 string.Format("<li class='catetitle' id='catetitle{0}'><a href='/category/{1}/{2}'>{3}</a></li>", i,
                                 category.Id, Common.ReplaceUnwantedChars(category.Name), category.Name));
                sb.AppendLine("<li style='display:none;' class='category_sub' ><div><ul>");
                foreach (var subCategory in dt.OfType<SubCategory>())
                {
                    sb.AppendLine(string.Format("<li><a href='category/{0}/{1}/{2}'>{3}</a></li>", category.Id,
                                                subCategory.Id, Common.ReplaceUnwantedChars(subCategory.Name),
                                                subCategory.Name));

                }
                i++;
            }
            sb.AppendLine("</div></ul></div>");
            ltlCategories.Text = sb.ToString();
        }

Добавив часы, я получил материал, приведенный ниже:

[0] { p = {InnovativeTechnosoft.BusinessBazaar.Web.UI.Core.Category}, relatedchilds = {System.Collections.Generic.List`1[InnovativeTechnosoft.BusinessBazaar.Web.UI.Core.SubCategory]} }    <Anonymous Type>

Требование: Из самого кода ясно, что мне нужно перебрать категорию и ее подкатегорию. У меня проблема и проверка состояния, где я использую dt.OfType<Category>() Если я просто использую foreach(Category c in dt), это дает мне исключение при касте.

Пожалуйста, помогите. Где и что я делаю не так.

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

То, что ваш метод GetAllCategoriesAndSubcategories() возвращает, является IQueryable анонимного типа - экземпляры этого типа не являются объектами Category, поэтому приведение всегда будет неудачным, а OfType<Category>() просто возвратит пустую коллекцию.

Вместо того, чтобы проецировать на анонимный тип, используйте вспомогательный класс, который позволит вам использовать его позже, т.е.

public class CategoryWithSubcategories
{
   public Category SomeCategory {get;set;}
   public IEnumerable<SubCategory> RelatedSubCategories {get;set;}
}

Затем измените сигнатуру метода GetAllCategoriesAndSubcategories на:

public IQueryable<CategoryWithSubcategories> GetAllCategoriesAndSubcategories()
{
    return from p in _context.Categories
    let relatedchilds = from c in _context.SubCategories
                        where c.CategoryId == p.Id
                        select c
                        select new CategoryWithSubcategories
                               {
                                  SomeCategory = p,
                                  RelatedSubCategories = relatedchilds
                               };
}

Теперь вы можете запросить возвращенное перечисление, например:

foreach (CategoryWithSubcategories category in dt)
{
   //your code here
   foreach (var subCategory in category.RelatedSubCategories)
   {
     //more code here
   }
}
0 голосов
/ 01 февраля 2012

Вы не возвращаете категории, вы возвращаете анонимный объект с категорией и множеством категорий.

Самый простой вариант, поскольку вы не используете запрос в той же области, в которой вы его создаете, - это создать простой объект и поместить результаты запроса в этот тип, а не в анонимный тип, который как вы можете привести к этому.

...