EF核心映射实体到模型

时间:2020-10-18 09:06:01

标签: c# entity-framework-core extension-methods sql-generation

我正在尝试有效地将实体映射到模型上。

我的实体是:

public class ParentEntity
{
    public int Id { get; set; }
    public string  Name { get; set; }
    public ChildEntity Child { get; set; }
}

public class ChildEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我的模型是:

public class ParentModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ChildModel Child { get; set; }
}

public class ChildModel
{
    public int Id { get; set; }
    public string Name { get; set; }
}

(在实践中,这些类之间会有差异,但为简化起见,这里没有。)

我写了一个扩展方法来做映射:

public static IQueryable<ParentModel> ToParentModel (this IQueryable<ParentEntity> parentEntities)
{
    return parentEntities.Select(p => new ParentModel
    {
        Id = p.Id,
        Name = p.Name,
        Child = new ChildModel { Id = p.Child.Id, Name = p.Child.Name.ToLower()}
    });
}

ToLower()可以突出显示问题。

我可以使用:

var parents = _context.Set<ParentEntity>().ToParentModel().ToArray();

生成的SQL是:

 SELECT "p"."Id", "p"."Name", "c"."Id", lower("c"."Name") AS "Name"
 FROM "Parents" AS "p"
 LEFT JOIN "Children" AS "c" ON "p"."ChildId" = "c"."Id" 

即小写的处理是在数据库中完成的。

到目前为止,一切都很好,只是关注点分离不好。初始化ChildModel的代码与初始化ParentModel的代码在同一位置。

我尝试在ChildModel中使用构造函数:

public ChildModel(ChildEntity ent)
{
    Id = ent.Id;
    Name = ent.Name.ToLower();
}

以及扩展方法中的

return parentEntities.Select(p => new ParentModel
{
    Id = p.Id,
    Name = p.Name,
    Child = new ChildModel (p.Child)
});

这有效,但是生成的SQL不包含lower。转换为小写字母是在程序中完成的。

有什么办法可以吃蛋糕吗?

我仍然可以将我的C#代码转换为SQL,但是仍然以模块化方式构造C#代码吗?

0 个答案:

没有答案