如何在我的NHibernate查询中只选择几列?

Har*_*rry 9 c# nhibernate

我有一个类到一个表映射; 遗憾的是,这个表有110多列,查询需要很长时间,特别是在大多数时候我只想查看<10列.

我的问题是查询是根据用户想要查看的内容动态生成的.我无法真正创建具有不同列的不同映射,因为会有非常多的组合.我正在使用条件API来生成查询.我还可以使用它来只选择用户想要的列吗?还是其他一些方法?

谢谢

Sun*_*oot 14

使用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
               };
Run Code Online (Sandbox Code Playgroud)

此外,如果您正在使用HQL,则只需选择与使用T-SQL类似的列,但使用a Transformer来获取强类型对象:

首先使用缩小的列创建一个类:

public class ProductReport
{
    public string Name { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }
    public int Units { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后你的查询:

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>();
Run Code Online (Sandbox Code Playgroud)

确保查询中的别名(如名称,描述等)与类中的属性名称匹配.


Tim*_*ers 7

使用a ProjectionList选择所需的列.请参阅此处的示例.

  • 如果链接死了,答案就没用了.包括一个小的,但必不可少的片段以及链接...... (8认同)

Col*_*e W 6

除了Tim给你的例子,你可以这样做:

IList selection =
    session.QueryOver<Cat>()
        .Select(
            c => c.Name,
            c => c.Age)
        .List<object[]>();
Run Code Online (Sandbox Code Playgroud)

以上示例来自:http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx