【问题标题】:How to select only a few columns in my NHibernate query?如何在我的 NHibernate 查询中只选择几列?
【发布时间】:2020-01-05 19:12:50
【问题描述】:

我有一个类到一个表的映射;不幸的是,这张表有 110 多列,查询需要很长时间,尤其是在大多数时候我只想查看

我的问题是查询是根据用户想要查看的内容动态生成的。我真的不能用不同的列创建不同的映射,因为会有非常多的组合。我正在使用标准 API 来生成查询。我也可以使用它来仅选择用户想要的列吗?还是其他方法?

谢谢

【问题讨论】:

  • 你说什么110栏?回到绘图板!
  • @V4Vendetta "什么?重新设计我宝贵的数据库?我花了数年时间完善它的结构,没有人会告诉我该怎么处理它!!!" (c) 您的客户...

标签: c# nhibernate


【解决方案1】:

使用 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>();

只要确保查询中的别名(如名称、描述等)与类中的属性名称匹配。

【讨论】:

  • 当我有 100 多个潜在的列/属性以及任何组合时都无济于事。无论如何,谢谢。
【解决方案2】:

除了蒂姆给你的例子,你还可以这样做:

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

【讨论】:

    【解决方案3】:

    使用ProjectionList 选择所需的列。 See here 示例。

    【讨论】:

    • 如果链接死了,答案有点没用。包括一个小而重要的 sn-p 以及链接...
    猜你喜欢
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2015-01-30
    • 2016-05-13
    • 1970-01-01
    • 2015-09-12
    相关资源
    最近更新 更多