将Children附加到父通用方法

时间:2011-12-16 16:18:37

标签: c# asp.net linq entity-framework

每个父对象都有一个Id每个子对象都有一个属性ParentId,用于标识像child.ParentId == parent.Id这样的唯一父对象。每个父对象都有属性Children

这个方法附加给每个父母子女的财产与父母匹配的孩子.Id == child.ParentId

private void AttachChildrenToParent(IEnumerable<dynamic> parents, 
                                           IEnumerable<dynamic> children)
{
    parents.GroupJoin(
        children,
        p => p.Id,
        c => c.ParentId,
        (p, cn) => new { Parent = p, Children = cn })
        .ToList().ForEach(x => x.Parent.Children = x.Children);
}

我的问题:

我实际上没有具有属性名称“Parent”“Children”的对象,而是我拥有表示子父关系的各种属性。所以我需要一个不对属性名称进行编码的泛型方法,并且我想要调用这样的方法。

任何人都可以帮助疲惫的大脑解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我将在调用此函数时假设您知道父/子关系属性是什么。

然后我会建议你使用委托(这是真正的lambdas)来解决这个问题。我就是这样做的。您可能必须使用代码才能使其工作(我还没有对其进行测试),但希望它能让您沿着解决方案的道路前进。

public delegate Guid GetProperty<T>(T obj);
        public delegate void AttachChildren<TParent, TChild>(TParent parent, IEnumerable<TChild> children);

        private void AttachChildrenToParent<TParent, TChild>(IEnumerable<TParent> parents, IEnumerable<TChild> children, GetProperty<TParent> getID, 
            GetProperty<TChild> getParentID, AttachChildren<TParent, TChild> attachObjects)
        {
            parents.GroupJoin(
           children,
           p => getID(p),
           c => getParentID(c),
           (p, cn) => new { Parent = p, Children = cn })
           .ToList().ForEach(x => attachObjects(x.Parent, x.Children)); 

        }

        private class Class1 { public Guid ID { get; set; } public IEnumerable<Class2> Children { get; set; } }
        private class Class2 { public Guid ID { get; set; } public Guid ParentID { get; set; } }
        private void test()
        {
            IEnumerable<Class1> lst1 = new List<Class1>();
            IEnumerable<Class2> lst2 = new List<Class2>();
            AttachChildrenToParent<Class1, Class2>(lst1, lst2, x => x.ID, x => x.ParentID, (x, y) => x.Children = y);
        }