我在数据库中有父实体和子实体。我需要让一些孩子和他们的父母分别作为 ChildBrief 和 ParentBrief 对象,它们只包含相应实体的一些字段。因此,ParentBrief 和 ChildBrief 是一种底层实体的映射。
我可以写:
IQueriable<ChildBrief> result = Childs.Select(x => new ChildBrief
{
Id = x.Id,
Name = x.Name,
Parent = new ParentBrief
{
Id = x.Parent.Id,
Name = x.Parent.Name
}
});
它将被完美地编译成生成的 SQL。但我希望 ParentBrief 映射器成为一个单独的静态函数,可以在其他地方重复使用,例如这里,我执行以下操作:
IQueriable<ChildBrief> result = Childs.Select(x => new ChildBrief
{
Id = x.Id,
Name = x.Name,
Parent = mapper.Compile()(x.Parent)
});
private static readonly Expression<Func<Parent, ParentBrief>> mapper =
m => new ParentBrief
{
Id = x.Parent.Id,
Name = x.Parent.Name}
};
EF5 引发一个错误,说明无法调用方法或类似的东西(可能在编译阶段)。
有什么方法可以将简单的表达式(只是平面映射)注入 EF 并使它们正确编译到 SQL 中?我还想在不预先执行的情况下获得 IQueryable 结果。