Hej! Tror inte det går att göra det med en enkel sats som letar vidare i godtyckligt många steg.Hjälp med LINQ
Jag har en tabell som ser ut så här.
CATEGORY
----------------------
ID - INT - PK - AutoIncrease
Titel - Varchar(30)
Parent - Int
Parent är NULL om det är en huvudkategory
Sedan har jag en produkt tabell med en referens till Category.ID.
Det jag behöver hjälp med är att få ut alla produkter under vald kategori och även produkter i underkategorier(kan vara i flera steg).Sv: Hjälp med LINQ
Men lite rekursion kanske?
public class Category
{
public int CategoryId { get; set; }
public int? ParentCategoryId { get; set; }
public string Title { get; set; }
}
public class Product
{
public string Title { get; set; }
public int CategoryId { get; set; }
}
public List<Product> GetProductsByCategory(int categoryId, List<Category> categories, List<Product> products)
{
var immediateChildren = products.Where(c => c.CategoryId == categoryId);
var descendantChildren = new List<Product>();
foreach (var subcategory in categories.Where(c => c.ParentCategoryId == categoryId))
{
descendantChildren.AddRange(GetProductsByCategory(subcategory.CategoryId, categories, products));
}
return immediateChildren.Union(descendantChildren).ToList();
}
public void TestGetProductsByCategory()
{
var categories = new List<Category>()
{
new Category() { CategoryId = 1, Title = "Böcker" },
new Category() { CategoryId = 2, Title = "Skönlitteratur", ParentCategoryId = 1 },
new Category() { CategoryId = 3, Title = "Facklitteratur", ParentCategoryId = 1 },
new Category() { CategoryId = 4, Title = "Fantasy", ParentCategoryId = 2},
new Category() { CategoryId = 5, Title = "Skräck", ParentCategoryId = 2}
};
var products = new List<Product>()
{
new Product() { CategoryId = 4, Title = "Kampen om skäggtronen"},
new Product() { CategoryId = 4, Title = "Sagan om skägget"},
new Product() { CategoryId = 5, Title = "Skäggets tid"},
new Product() { CategoryId = 5, Title = "Ett skägg kommer lastat"},
new Product() { CategoryId = 3, Title = "Skägg Smorgasbord"},
new Product() { CategoryId = 3, Title = "Skägg for dummies"},
new Product() { CategoryId = 3, Title = "Allt om skägg"}
};
var result = GetProductsByCategory(1, categories, products); // Borde vara alla 7
result = GetProductsByCategory(6, categories, products); // Borde vara tomt
result = GetProductsByCategory(4, categories, products); // Borde vara de 2 under Fantasy
result = GetProductsByCategory(2, categories, products); // Borde vara de 2 under Fantasy, samt de 2 under Skräck
var cycleCategories = new List<Category>()
{
new Category() { CategoryId = 1, Title = "Velocipeder", ParentCategoryId = 2 },
new Category() { CategoryId = 2, Title = "Cyklar", ParentCategoryId = 1 }
};
result = GetProductsByCategory(2, cycleCategories, products); // Torde gå sådär halvbra...
}
Edit: formatering och la till ett fall med cykliskt kategoriträd