我有一個類到一個表映射;不幸的是,這個表格有110多列,查詢需要很長時間,特別是在大多數時候我只想查看10列。如何在我的NHibernate查詢中僅選擇幾列?
我的問題是,查詢是基於用戶想要查看的動態生成的。我無法用不同的列創建不同的映射,因爲會有非常多的組合。我正在使用標準API來生成查詢。我是否也可以使用它來僅選擇用戶想要的列?或者其他一些方法?
感謝
我有一個類到一個表映射;不幸的是,這個表格有110多列,查詢需要很長時間,特別是在大多數時候我只想查看10列。如何在我的NHibernate查詢中僅選擇幾列?
我的問題是,查詢是基於用戶想要查看的動態生成的。我無法用不同的列創建不同的映射,因爲會有非常多的組合。我正在使用標準API來生成查詢。我是否也可以使用它來僅選擇用戶想要的列?或者其他一些方法?
感謝
容易做到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多個潛在的列/屬性與任何組合時,沒有幫助。不管怎麼說,還是要謝謝你。 – Harry 2011-05-24 16:14:38
除了例如蒂姆給了你可以做這樣的事情:
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
你說什麼110列?回到繪圖板 ! – V4Vendetta 2011-05-24 13:34:54
@ V4Vendetta「什麼?重新設計我珍貴的數據庫?我花了好幾年的時間來完善它的結構,沒有人會告訴我該怎麼處理它! (c)您的客戶... – Spook 2016-08-02 06:00:26