[英]EF6: Mapping to ViewModel Reusability
使用Entity Framework 6,我在类对象和包含在类中的viewmodel对象之间有映射函数,如下所示:
public class DataMappers
{
public static Expression<Func<Data.Models.Employer, EmployerViewModel>> EmployerMapper = (e => new EmployerViewModel()
{
Name = e.Name,
Location = e.Location
....
});
}
然后我可以在多个地方调用,如下所示:
results = db.Employers.OrderBy(e => e.Name)
.Select(DataMappers.EmployerMapper)
.ToList();
这将生成仅包含我需要的列的SQL语句。 我的问题是,如果其他表引用我的'雇主'表,是否还有重用它? 即
public static Expression<Func<Data.Models.Person, PersonViewModel>> Person = (p => new PersonViewModel()
{
FirstName = p.FirstName,
LastName = p.LastName,
Employer = *use the 'EmployerMapper' expression above on p.Employer*
....
});
可以这样做,还是我需要在这种情况下复制映射代码?
我尝试在第二个示例中使用它作为Func
而不是Expression<Func>
,它将编译( Employer = EmployerMapper(p.Employer)
),但是,您收到The LINQ expression node type 'Invoke' is not supported in LINQ to Entities
运行时The LINQ expression node type 'Invoke' is not supported in LINQ to Entities
异常。
你必须安装LinqKit ,并使用它的AsExpandable()
:
using LinqKit;
results = db.Employers.AsExpandable()
.OrderBy(e => e.Name)
.Select(DataMappers.EmployerMapper)
.ToList();
而你的投影功能:
using LinqKit;
public static Expression<Func<Data.Models.Person, PersonViewModel>> Person = (p => new PersonViewModel()
{
FirstName = p.FirstName,
LastName = p.LastName,
Employer = DataMappers.EmployerMapper.Invoke(p.Employer)
});
在LinqKit以及如何更多信息,它的工作原理在这里 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.