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