我有一个复杂的实体,非常沉重。 我想从数据库中仅选择此实体的ID和名称以获得更好的性能。 我如何用nhibernate(或流利的nhibernate)来做到这一点。
答案 0 :(得分:5)
有几种不同的可能性。
创建新实体
一种可能的解决方案是创建一个新实体并将其映射到同一个表,但只映射您想要的列(id和name)。这非常灵活,允许您将该实体用作任何其他实体。问题是你引入了一些重复。
使用HQL
另一种解决方案是使用投影。使用HQL,您可以使用select子句指定要检索的列。如果您希望将适当的实体实例作为查询的结果而不是对象数组,则可以为类创建自定义构造函数并在HQL查询中使用它。
session.CreateQuery("select new Foo(f.Id, f.Name) from Foo f").List<Foo>();
使用Criteria API
如果要使用Criteria API而不是HQL,可以使用SetProjection方法。如果您想从查询中获取正确的实体而不是对象数组,则可以使用AliasToBean结果转换器。
session.CreateCriteria(typeof(Foo))
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Name"), "Name")
.Add(Projections.Property("Id"), "Id"))
.SetResultTransformer(Transformers.AliasToBean(typeof(Foo)))
.List();
标准示例代码借鉴了以下问题,这可能是有意义的: NHibernate - Only retrieve specific columns when using Critera queries?
答案 1 :(得分:1)
您有两个选择:
使用ICriteria时 - 使用(语法可能不正确但你得到了图片)
SetProjections(Projections.ProjectionList.Add(Projections.Property("prop"))
.Add(Projections.Property("prop1")))
使用hql时
select c.Col1,c.Col2 from table c
它们都将返回一个数组列表列表 - 或类似的东西 - 然后你必须遍历它并构建你的..字典(或任何你有的)。