C# 在某些情况下,是否需要额外的计算列?
我正在使用NHibernate的最新版本,最近我偶然发现了一个有趣的问题 假设我有一个名为Profile的表,我希望收到我所有配置文件的列表。然而,有了它,我就有了一个名为C# 在某些情况下,是否需要额外的计算列?,c#,nhibernate,orm,C#,Nhibernate,Orm,我正在使用NHibernate的最新版本,最近我偶然发现了一个有趣的问题 假设我有一个名为Profile的表,我希望收到我所有配置文件的列表。然而,有了它,我就有了一个名为CanDelete的计算列,它禁止删除(例如)正在使用的概要文件 但是,这个CanDeletecomputed列不是我的实体的一部分,我不想在这个场景中只需要CanDelete值时污染实体,并且为每个配置文件单独计算它太慢了 在NHibernate中是否有一种方法可以执行一些查询,并将该查询的行作为对象获取,然后以某种方式获取
CanDelete
的计算列,它禁止删除(例如)正在使用的概要文件
但是,这个CanDelete
computed列不是我的实体的一部分,我不想在这个场景中只需要CanDelete
值时污染实体,并且为每个配置文件单独计算它太慢了
在NHibernate中是否有一种方法可以执行一些查询,并将该查询的行作为对象获取,然后以某种方式获取一个额外的计算列
假设我使用的是N层体系结构。在表示层中,我始终需要一个所有配置文件的列表(对于每个配置文件,无论我是否可以删除它)。我的业务逻辑层和数据访问层会是什么样子
现在,在我的存储库中,我有一个GetProfiles
方法,然后是一个candeletprofile
方法,我为获取的每个概要文件运行该方法。但就像我上面提到的,它实在太慢了。我可以创建一个GetProfilesWithCanDeleteStatus
方法,但这需要我创建一个专门的实体,并在其中包含计算列
当我不想在我的配置文件列表中点击O(n^2)
performance时,您对如何以正确的方式构建这个有什么建议?我想避免n+1问题
我不一定要寻找NHibernate解决方案(我给NHibernate加上标签,因为它可能有一些用于这类事情的特定工具),也欢迎其他ORM的通用解决方案。我有一个可能对您有好处的想法,但它不是一个完美的想法,因为您设计程序的每种方式都有其缺点 我建议您更改该列
CanDelete
的定义,使其与该实体中的任何其他列一样(不是在运行时计算的),并且类型为Boolean,但不会损害需求
这样做就像从db中选择任何其他简单的一样,非常快速
现在,棘手的部分是确保该列(在任何需要的时候)指示它是否被使用(以及是否可以删除)
因为我不知道如果使用了配置文件实体(并且可以删除),那么计算的方式是什么,所以很难准确地告诉您如何设计DAL和BL,但指导原则是:
在每一个其他地方,您都会更改(该实体或其他实体的)DB中的一个状态,该状态可能会更改列CanDelete
,您使用一个函数封装该值,以再次计算该值,验证其状态,并在需要时更改它
如果您确保每次更改BL中计算出的CanDelete
列中的一列时,您确保CanDelete
列始终为真指示
这种方法的缺点是:
1.它为程序员在需要时不使用封装函数的错误打开了一个空间。
2.假设此应用程序是唯一更改此数据库的应用程序。
3.您必须小心从ManagementStudio或脚本插入原始数据
我希望这对你的BL有好处。我有一个可能对你有好处的想法,但这不是一个完美的想法,因为你设计程序的每一种方式都有它的缺点
我建议您更改该列CanDelete
的定义,使其与该实体中的任何其他列一样(不是在运行时计算的),并且类型为Boolean,但不会损害需求
这样做就像从db中选择任何其他简单的一样,非常快速
现在,棘手的部分是确保该列(在任何需要的时候)指示它是否被使用(以及是否可以删除)
因为我不知道如果使用了配置文件实体(并且可以删除),那么计算的方式是什么,所以很难准确地告诉您如何设计DAL和BL,但指导原则是:
在每一个其他地方,您都会更改(该实体或其他实体的)DB中的一个状态,该状态可能会更改列CanDelete
,您使用一个函数封装该值,以再次计算该值,验证其状态,并在需要时更改它
如果您确保每次更改BL中计算出的CanDelete
列中的一列时,您确保CanDelete
列始终为真指示
这种方法的缺点是:
1.它为程序员在需要时不使用封装函数的错误打开了一个空间。
2.假设此应用程序是唯一更改此数据库的应用程序。
3.您必须小心从ManagementStudio或脚本插入原始数据
我希望这对你的BL有好处