0

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

我的实体是:

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" 

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

到目前为止一切都很好,除了关注点分离不好。初始化 a 的代码与初始化 a 的代码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# 代码?

4

0 回答 0