我有一个类到一个表映射;不幸的是,这个表有110多列,查询需要很长时间,特别是在大多数时候我只想查看< 10列。
我的问题是查询是根据用户想要查看的内容动态生成的。我无法真正创建具有不同列的不同映射,因为会有非常多的组合。我正在使用条件API来生成查询。我还可以使用它来只选择用户想要的列吗?还是其他一些方法?
由于
答案 0 :(得分:13)
使用LINQ很容易(假设您使用的是NHibernate 3.0或更高版本):
var products = from p in Session.Query<Product>()
where // ...some query (snip)
select new
{
Name = p.ProductName,
Description = p.ShortDesc,
Price = p.Price,
Units = p.Quantity
};
此外,如果您正在使用HQL,则只需选择与使用T-SQL类似的列,但使用Transformer
来获取强类型对象:
首先使用缩小的列创建一个类:
public class ProductReport
{
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public int Units { get; set; }
}
然后你的查询:
string hql = "select p.ProductName as Name, p.ShortDesc as Description ...(snip) " +
"from Product p " +
"where ...some query (snip)";
IQuery query = Session.CreateQuery(hql)
.SetResultTransformer(Transformers.AliasToBean<ProductReport>());
IList<ProductReport> products = query.List<ProductReport>();
确保查询中的别名(如名称,描述等)与您班级中的属性名称匹配。
答案 1 :(得分:6)
使用ProjectionList
选择所需的列。 See here示例。
答案 2 :(得分:6)
除了Tim给你的例子,你可以这样做:
IList selection =
session.QueryOver<Cat>()
.Select(
c => c.Name,
c => c.Age)
.List<object[]>();
以上示例来自:http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx