Вы можете использовать Linq в сочетании с рекурсивными функциями:
static IEnumerable<Special> getSpecials(Item1 item1)
{
var item2Specials = item1.Items2.SelectMany(item2 => getSpecials(item2));
var item3Specials = item1.Items3.SelectMany(item3 => getSpecials(item3));
return item1.Specials.Concat(item2Specials).Concat(item3Specials);
}
Мне было немного трудно понять ваши обозначения структуры вашего класса. Я предполагаю, что вы имели в виду следующие классы C #:
class Item1
{
public List<Item2> Items2 = new List<Item2>();
public List<Item3> Items3 = new List<Item3>();
public List<Special> Specials = new List<Special>();
}
class Item2 : Item1 { }
class Item3 : Item1 { }
class Special
{
public int Value { get; set; }
public string Name { get; set; }
}
Я также предполагаю, что вы имеете в виду Linq-to-objects, а не Linq-to-SQL. Если вы хотите сохранить иерархические данные в базе данных, вам не следует этого делать, а вместо этого посмотрите на модель вложенного набора .