2010-02-14 209 views
1
List<object[]> products = GetSession().CreateCriteria<Product>() 
      .SetProjection(Projections.ProjectionList() 
           .Add(Projections.Property("Id")) 
           .Add(Projections.Property("Name")) 
           .Add(Projections.Property("Price")) 
      ) 
      .List(); 
public class ProductRow 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public double Price { get; set; } 
} 

我怎樣才能得到的結果作爲List <ProductRow>類型類型化的類型?NHibernate的投影:如何獲得使用標準API與投影

我看到有一個函數Projection.Cast,但我沒有看到有關如何使用它的任何文檔。

+0

porjection - > projection Ceritria - > Criteria – labilbe 2010-02-14 08:16:10

回答

3

您可以嘗試設置結果變壓器:

var result = GetSession() 
    .CreateCriteria<Product>() 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.Property("Id"), "Id") 
     .Add(Projections.Property("Name"), "Name") 
     .Add(Projections.Property("Price"), "Price") 
    ) 
    .SetResultTransformer(Transformers.AliasToBean<ProductRow>()) 
    .List<ProductRow>(); 

注意添加每個投影時指向ProductRow的屬性別名的使用。

+0

'.Add(Projections.Property(「Category.Name」),「Category」)'在這種情況下我得到錯誤:'無法解析屬性:類別。 Project.Domain.Model.Product的名稱'。 – 2010-02-14 19:22:08

+0

我相信你需要爲你的Category屬性添加一個別名,而不是使用別名。因此,如果您使用AddAlias爲「Category」提供別名「c」,則可以使用「c.Name」而不是「Category.Name」。 – Kristoffer 2010-06-16 20:44:47

-1

我一直沒能找到解決這個問題的具體方法。幾天前我發佈了一個類似的問題。 (http://stackoverflow.com/questions/3921457/nhibernate-entity-access-through-projection)錯誤信息是因爲NHibernate正在您的產品類中尋找一個名爲Category的屬性。我認爲沒有一個。迄今爲止我所能找到的最近使用的是DTO。同樣,使用表達式樹,Lambda表達式和/或ExpressionSelector更深入地觀察動態DTO生成器和動態LINQ到NHibernate。所有這些看起來都比較複雜。我希望有一個簡單的解決方案來動態地設置實體,即,投影。