如何从匿名列表中选择父母及其所有孩子的列表

时间:2012-01-31 20:00:20

标签: c# asp.net linq-to-sql

我的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 个答案:

答案 0 :(得分:1)

您的方法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
   }
}

答案 1 :(得分:0)

您没有返回类别,您将返回一个具有类别和可枚举类别的匿名对象。

最简单的选项,因为你没有在你创建它的同一范围内使用查询,就是创建一个简单的对象并将查询结果放入该类型,而不是使用匿名类型,你可以投入的方式。