我正在尝试有效地将实体映射到模型上。
我的实体是:
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# 代码?