2010-02-05 31 views
6

giả sử trong một thực thể có id thuộc tính, tên người dùng, tuổi, địa chỉ. Bây giờ tôi chỉ muốn id và tên người dùng và tôi sử dụng mã này cho nó.Phép chiếu trong NHibernate

Phép chiếu cho phép trả lại thứ gì đó khác với danh sách các thực thể từ truy vấn.

var proj = Projections.ProjectionList() 
    .Add(Projections.Property("Id"), "Id") 
    .Add(Projections.Property("Username"), "Username"); 

var list2 = DetachedCriteria.For<User>() 
    .Add(Expression.Eq("Username", "lachlan")) 
    .GetExecutableCriteria(sessionFactory.GetCurrentSession()) 
    .SetProjection(proj) 
    .List(); 

Tôi sẽ lấy giá trị như thế nào. Trong đó đối tượng sẽ có giá trị này được thực hiện.

Trả lời

27

Trừ khi biến áp kết quả được sử dụng, phép chiếu sẽ dẫn đến danh sách các đối tượng ẩn danh với các giá trị dự kiến. Điều này sẽ là đủ cho databinding.

Để sử dụng khác, bạn muốn đặt biến thế kết quả sẽ tạo đối tượng của một loại đã biết. AliasToBeanTransformer sẽ tạo đối tượng thuộc loại được chỉ định cho mỗi hàng và đặt thuộc tính của nó thành giá trị hàng.

Nếu bạn biết loại kết quả, bạn có thể sử dụng phương pháp chung List<T>().

var proj = Projections.ProjectionList() 
    .Add(Projections.Property("Id"), "Id") 
    .Add(Projections.Property("Username"), "Username"); 

var list2 = DetachedCriteria.For<User>() 
    .Add(Expression.Eq("Username", "lachlan")) 
    .GetExecutableCriteria(sessionFactory.GetCurrentSession()) 
    .SetProjection(proj) 
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result))) 
    .List<Result>(); 

Biến thế kết quả cũng có thể được sử dụng trên truy vấn SQL và HQL.

list2 = Session.CreateSQLQuery("select Id, Username from user_table") 
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result))) 
    .List<Result>(); 

list2 = Session.CreateQuery("select Id, Username from User") 
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result))) 
    .List<Result>(); 

Trong các ví dụ này, lớp Kết quả không cần phải là lớp được ánh xạ và phải có các thuộc tính đã chọn.

partial class Result 
{ 
    public int Id { get; set; } 
    public string Username { get; set; } 
} 
+0

mặc dù tôi không sử dụng khung 3.0 (từ khóa var), cuối cùng tôi có thể tìm ra cách chọn từng cột bằng cách sử dụng câu trả lời này! đưa tôi cả ngày để tìm nó –

Các vấn đề liên quan