gpt4 book ai didi

c# - EF6 : Mapping to ViewModel Reusability

转载 作者:太空狗 更新时间:2023-10-30 01:04:15 25 4
gpt4 key购买 nike

使用 Entity Framework 6,我在类中包含的模型对象和 View 模型对象之间具有映射函数,如下所示:

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运行时异常。

最佳答案

您必须安装 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 及其工作原理的更多信息 here .

关于c# - EF6 : Mapping to ViewModel Reusability,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24193265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com