2011-05-24 17 views
6

我有一個類到一個表映射;不幸的是,這個表格有110多列,查詢需要很長時間,特別是在大多數時候我只想查看10列。如何在我的NHibernate查詢中僅選擇幾列?

我的問題是,查詢是基於用戶想要查看的動態生成的。我無法用不同的列創建不同的映射,因爲會有非常多的組合。我正在使用標準API來生成查詢。我是否也可以使用它來僅選擇用戶想要的列?或者其他一些方法?

感謝

+12

你說什麼110列?回到繪圖板 ! – V4Vendetta 2011-05-24 13:34:54

+1

@ V4Vendetta「什麼?重新設計我珍貴的數據庫?我花了好幾年的時間來完善它的結構,沒有人會告訴我該怎麼處理它! (c)您的客戶... – Spook 2016-08-02 06:00:26

回答

3

使用ProjectionList選擇您想要的列。 See here的例子。

+7

如果鏈接死亡,答案是沒用的。包括一個小的,但必不可少的片段以及鏈接... – 2015-09-17 12:35:16

9

容易做到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>(); 

只要確保在您的查詢中生成別名(如名稱,描述等)匹配您類中的屬性名稱即可。

+0

當我有100多個潛在的列/屬性與任何組合時,沒有幫助。不管怎麼說,還是要謝謝你。 – Harry 2011-05-24 16:14:38