我想知道,因为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();
答案 0 :(得分:2)
选择1个属性(或多个属性)是投影。 NHibernate肯定支持投影,并且在许多情况下使用投影是有意义的。
这取决于您要解决的问题。如果您不知道存在问题,那么我建议不要使用投影来选择单个属性 - 使用实体要容易得多。但是,如果您遇到真正的性能问题,那么您应该分析发生了什么以及瓶颈在哪里,如果在分析之后您发现它确实是因为您选择的是整个实体而不是单个属性,那么一定要使用投影。
话虽如此,除非您的实体拥有大量属性和/或大数据,否则投影单个属性可能没有意义。此外,还会有一些轻微的性能损失,例如重复的查询计划。
答案 1 :(得分:0)
我认为ORM“NHibernate”的主要思想是给予使用全价值对象(实体)的机会。如果你使用的查询只能获得几个字段(不是所有对象),那么你就无法使用NHibernate的大部分优势。