0

我想知道既然 nhibernate 必须制作整个对象,这样做有意义吗?

Session.Query<Table>().Where(x => x.Id == id).Select(x => x.ColumnA).FirstOrDefault();

还是这样做会更好

Session.Query<Table>().Where(x => x.Id == id).FirstOrDefault();

我正在尝试决定是否应该在我的服务层中创建一个单独的方法来返回 ColumnA 并使用另一个方法返回所有字段。

或者我应该只使用一种方法来返回所有字段,就像第二个示例一样。

一方面,如果我以第一种方式进行操作,则必须从数据库返回更少的数据,尤其是当您知道将只使用一列时。另一方面,如果我需要为每一列添加它会很糟糕。

 Session.Query<Table>().Where(x => x.Id == id).Select(x => x.ColumnB).FirstOrDefault();
 Session.Query<Table>().Where(x => x.Id == id).Select(x => x.ColumnC).FirstOrDefault();
4

2 回答 2

2

选择 1 个属性(或其中的多个)是一个投影。NHibernate 确实支持投影,并且在许多情况下使用投影是有意义的。

这取决于您要解决的问题。如果您不知道存在问题,那么我非常建议不要使用投影来选择单个属性 - 使用实体要容易得多。但是,如果您面临真正的性能问题,那么您应该分析正在发生的事情以及瓶颈在哪里,如果在分析之后您发现这确实是因为您选择的是整个实体而不是它的单个属性,那么一定要使用投影。

话虽如此,除非您的实体拥有大量属性和/或大量数据,否则投影单个属性可能没有意义。还会有一些小的性能损失,例如重复的查询计划。

于 2012-09-27T08:52:36.457 回答
0

我认为 ORM“NHibernate”的主要思想是提供使用全值对象(实体)的机会。如果您使用的查询仅获得几个字段(不是所有对象),那么您无法使用 NHibernate 的大部分优势,这是一种错误的方式。

于 2012-09-27T08:08:31.707 回答