gpt4 book ai didi

c# - 将实体连同子实体一起转换为 DTO

转载 作者:行者123 更新时间:2023-11-29 02:10:42 25 4
gpt4 key购买 nike

尝试将实体对象转换为本地对象,以便我可以将其用于进一步的转换。

这是我用来转换实体对象的代码;

IEnumerable<SystemArea> result = (from sa in CurrentContext.systemarea                                 
select new SystemArea
{
SystemAreaId = sa.SystemAreaId,
SystemAreaCode = sa.SystemAreaCode,
SystemAreaType = sa.SystemAreaType,
SystemAreaDescription = sa.SystemAreaDescription,
SystemAreaCreatedDate = sa.SystemAreaCreatedDate,
SystemAreaUpdateDate = sa.SystemAreaUpdateDate,
SystemAreaStatus = sa.SystemAreaStatus,
Count = sa.systemareafunctionality.Count,
SystemAreaFunctionality = sa.systemareafunctionality.Select(e => new SystemAreaFunctionality { SystemAreaCode =e.SystemAreaCode })
}).ToList();

这里的count变量是为了确认里面有没有子数据。

SystemAreaFunctionality 是我在这里尝试使用 SELECT 函数转换的子对象,但它始终是空白集合。剩余数据正在分配给父对象,但这里唯一缺少的是子表记录。我哪里错了,请帮忙!

生成的 SQL:

SELECT
`Project3`.`C1`,
`Project3`.`SystemAreaId`,
`Project3`.`SystemAreaCode`,
`Project3`.`SystemAreaType`,
`Project3`.`SystemAreaDescription`,
`Project3`.`SystemAreaCreatedDate`,
`Project3`.`SystemAreaUpdateDate`,
`Project3`.`SystemAreaStatus`,
`Project3`.`C3` AS `C2`,
`Project3`.`C2` AS `C3`,
`Project3`.`SystemAreaCode1`
FROM (SELECT
`Project1`.`SystemAreaId`,
`Project1`.`SystemAreaCode`,
`Project1`.`SystemAreaType`,
`Project1`.`SystemAreaDescription`,
`Project1`.`SystemAreaCreatedDate`,
`Project1`.`SystemAreaUpdateDate`,
`Project1`.`SystemAreaStatus`,
1 AS `C1`,
`Project2`.`SystemAreaCode` AS `SystemAreaCode1`,
`Project2`.`C1` AS `C2`,
`Project1`.`C1` AS `C3`
FROM (SELECT
`Extent1`.`SystemAreaId`,
`Extent1`.`SystemAreaCode`,
`Extent1`.`SystemAreaType`,
`Extent1`.`SystemAreaDescription`,
`Extent1`.`SystemAreaCreatedDate`,
`Extent1`.`SystemAreaUpdateDate`,
`Extent1`.`SystemAreaStatus`,
(SELECT
COUNT(1) AS `A1`
FROM `systemareafunctionality` AS `Extent2`
WHERE `Extent1`.`SystemAreaCode` = `Extent2`.`SystemAreaCode`) AS `C1`
FROM `systemarea` AS `Extent1`) AS `Project1` LEFT OUTER JOIN (SELECT
`Extent3`.`SystemAreaCode`,
1 AS `C1`
FROM `systemareafunctionality` AS `Extent3`) AS `Project2` ON `Project1`.`SystemAreaCode` = `Project2`.`SystemAreaCode`) AS `Project3`
ORDER BY
`Project3`.`SystemAreaCode` ASC,
`Project3`.`C2` ASC

JSON 输出:

[{"SystemAreaId":1,"SystemAreaCode":"KIO","SystemAreaType":"KIOSK","SystemAreaDescription":"tasks related to receptionist","SystemAreaCreatedDate":"/Date(1543421018000)/","SystemAreaUpdateDate":"/Date(1543421018000)/","SystemAreaStatus":true,"SystemAreaFunctionality":[],"Count":1}]

PS:请不要建议自动映射器或扩展方法。谢谢!

最佳答案

意见:

我花了两天时间让 MySQL(最新版本)与 EF 一起工作,相信我,这是一项艰苦的工作,相反,EF 与 MSSQL 非常简单且易于实现。

我经历过的一件事是 Oracle 对为免费版本的 MySQL 提供任何支持都不感兴趣,因此他们在新版本的文档上草率,并提供不稳定的 .NET 连接器。

实际答案:

EF 的行为非常奇怪,只有当我要求 EF 加载子实体的子实体(即 SystemAreaFunctionalityEmployeeRoleMapping,它是 SystemAreaFunctionality 的子实体)时,它才会加载子实体 (SystemAreaFunctionality) 中的数据,这也意味着我不得不采取不必要的数据。

所以我的链接查询看起来像这样:

var result = (from sa in CurrentContext.systemarea
select new SystemArea
{
SystemAreaId = sa.SystemAreaId,
SystemAreaType = sa.SystemAreaType,
Count = sa.systemareafunctionality.Count,
SystemAreaFunctionalities = sa.systemareafunctionality.Select(saf => new SystemAreaFunctionality
{
SystemAreaId = saf.SystemAreaId,
SystemAreaFunctionalityController = saf.SystemAreaFunctionalityController,
SystemAreaFunctionalityAction = saf.SystemAreaFunctionalityAction,
SystemAreaFunctionalityType = saf.SystemAreaFunctionalityType,
SystemAreaFunctionalityEmployeeRoleMappings = saf.systemareafunctionalityemployeerolemapping.Select(saferm => new SystemAreaFunctionalityEmployeeRoleMapping
{
SystemAreaFunctionalityEmployeeRoleMappingId = saferm.SystemAreaFunctionalityEmployeeRoleMappingId,
SystemAreaFunctionalityCreatedDate = saferm.SystemAreaFunctionalityCreatedDate
})
})
}).ToList();

可选:

这次尝试使用具有不同数据库的相同 linq 查询(发布在 OP 中)和 PostgreSQL 加上 npgsql 连接器,令人惊讶的是 EF 给了我我想要的东西而没有额外的负担。最重要的是,PostgreSQL 通过 EF 提供比 MySQL 更好的性能。所以我认为切换到 PostgreSQL 会是更好的选择。

PS: 如果您决定使用开源 DBMS,那么请在开始使用 MySQL 之前引用这篇文章:

关于c# - 将实体连同子实体一起转换为 DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53536179/

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