我的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)
,它会让我抛出异常。
请帮忙。在哪里以及我做错了什么。
答案 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)
您没有返回类别,您将返回一个具有类别和可枚举类别的匿名对象。
最简单的选项,因为你没有在你创建它的同一范围内使用查询,就是创建一个简单的对象并将查询结果放入该类型,而不是使用匿名类型,你可以投入的方式。