父子关系Linq to SQL

时间:2010-03-06 20:05:54

标签: c# linq-to-sql

我正在使用Linq to SQL并拥有类似

的表
*ItemTable*
ItemId Description 
1      Root 
2      Child 1
3      Child 2
4      Child of Child1
5      Child of Child1

*ItemChildTable* 
ParentID ChildId 
1          2
1          3
2          4
3          5

使用LINQ to SQL对它们进行建模的最佳方法是什么 这样我就可以获得像

这样的对象关系
Item parent;
Item child = parent.ChildItems.First();

这里我希望childItems的类型与存储在另一个表中的父级和子级的关系相同

1 个答案:

答案 0 :(得分:0)

您尝试在LINQ查询中获取递归。我不知道它是否可行或是否有效。它认为你应该把这个留给C#。像这样:

var items = db.ItemTables.ToList();
var itemRelations = db.ItemChildTables.ToList();

var root = items.SingleOrDefault(item => ! itemRelations.Exists(rel => rel.ChildId == item.ItemId));
if(root != null)
{
    Item rootItem = new Item();
    rootItem.ItemId = root.ItemId;
    List<Item> childLessItems = new List<Item>{ rootItem };
    while(childLessItems.Count > 0)
    {
        List<Item> newChildLessItems = new List<Item>();
        foreach(var parent in childLessItems)
        {
            var childIds =  from rel in itemRelations
                            where rel.ParentID == parent.ItemId
                            select rel.ChildId;
            var children = items.Where(maybeChild => childIds.Contains(maybeChild.ItemId));
            foreach(var child in children)
            {
                Item childItem = new Item();
                childItem.ItemId = child.ItemId;
                childItem.Parents.Add(parent);
                    parent.ChildItems.Add(childItem);
                newChildLessItems.Add(child);
            }
        }
        childLessItems = newChildLessItems;
    }
}