如何组合两个表达式树体?

时间:2014-10-01 15:17:51

标签: c# linq lambda expression graphdiff

如果我有:

m => m.OwnedCollection(p => p.Addresses)

m => m.OwnedCollection(p => p.Contacts)

我想将它们合并为:

m => m.OwnedCollection(p => p.Addresses).OwnedCollection(p => p.Contacts)

有没有办法做到这一点?

我也希望能够结合起来:

m => m.OwnedCollection(p => p.Contacts)

with => with.AssociatedCollection(p => p.AdvertisementOptions)

是:

m => m.OwnedCollection(p => p.Contacts, with => with.AssociatedCollection(p => p.AdvertisementOptions))

还有办法做这个吗?

我希望这些是相当简单的要求,但我发现很难掌握这些术语。

一些背景知识:

我正在使用https://github.com/refactorthis/GraphDiff来支持合并实体以进行更新。问题是它需要一个描述要更新的enitity关系的表达式树,例如

context.UpdateGraph(company, map => map
    .OwnedCollection(p => p.Contacts, with => with
        .AssociatedCollection(p => p.AdvertisementOptions))
    .OwnedCollection(p => p.Addresses)
);

Mine需要是一个通用的解决方案,所以我需要使用反射检查我的实体类型的各种一对一,一对多和多对多关系,并将它们转换为表达式树。

对我的具体问题或一般帮助的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

GraphDiff的develop分支为基于属性的映射提供支持。您可以将自定义属性(OwnedAssociated)添加到模型类的导航属性中,而不是提供映射图形的表达式树,GraphDiff会为您创建映射。有关这方面的一些例子,请查看GraphDiffs test models