2011-06-23 29 views
5

Điều tôi muốn làm là hiển thị một mạng lưới dữ liệu đơn giản chứa dữ liệu thực thể và dữ liệu tổng hợp của các con của nó. Ví dụ: cho phép sử dụng Đơn hàng và chi tiết đơn hàng. Tôi muốn hiển thị thông tin đơn đặt hàng và số lượng chi tiết đơn hàng.NHibernate QueryOver chọn thực thể và tổng hợp

OrderID, OrderDate, NumOfLineItems

Bây giờ bình thường trong SQL bạn có thể thực hiện theo nhiều cách. Nhưng đây là cách duy nhất tôi có thể nghĩ rằng có thể làm việc khi dịch NHibernate.

SELECT o.OrderID, OrderDate, NumOfLineItems 
FROM #Orders o 
INNER JOIN 
(SELECT o2.OrderID, COUNT(*) As NumOfLineItems FROM #LineItems l 
INNER JOIN #Orders o2 ON o2.OrderID = l.OrderID 
WHERE UserID = 1 GROUP BY o2.OrderID) t1 ON o.OrderID = t1.OrderID 
WHERE UserID = 1 

Tôi biết có nhiều cách khác, nhưng tôi đang cố nghĩ cách NHibernate sẽ cho phép tôi thực hiện bằng cú pháp QueryOver. Tôi không muốn sử dụng các cột có nguồn gốc. Tôi đang cố gắng tránh viết SQL.

Đối với các thực thể của tôi, tôi có một thực thể Order, và một thực thể AggregatedOrder, sẽ là DTO của tôi trong trường hợp này, và tôi dự định sử dụng aliastobean biến áp để sao chép dữ liệu vào nó.

Tôi hoàn toàn không biết cách tìm hiểu điều này.

Tất cả tôi có cho đến nay:

 QueryOver<LineItem> x = QueryOver.Of<LineItem>() 
      .SelectList(p => p .SelectCount(l => l.Id).WithAlias(() => itemAlias.NumOfLineItems)) 
      .JoinQueryOver<Order>(l => l.Order) 
      .Where(o => o.UserID == userID) 


     var y = session.QueryOver<Listing>() 
      .JoinQueryOver<Bid>(x); // no idea whats going on here 

Trả lời

5

Given:

public class Order 
{ 
    public virtual int OrderId {get; set;} 
    public virtual DateTime OrderDate {get; set;} 
    public virtual IList<LineItem> LineItems {get; set;} 
} 
public class LineItem 
{ 
    public virtual int Id {get; set;} 
    public virtual string Description {get; set;} 
} 

Để truy vấn một chiếu chính về trật tự + Tổng hợp LineItem sử dụng QueryOver API bạn có thể làm như sau:

OrderDto orderDto = null; 
LineItem items = null; 
var results = session.QueryOver<Order>() 
    .JoinAlias(o => o.LineItems,() => items) 
    .Select(Projections.ProjectionList() 
     .Add(Projections.Property<Order>(o=>o.Id).WithAlias(()=>orderDto.OrderId)) 
     .Add(Projections.Property<Order>(o=>o.DateOrdered).WithAlias(()=>orderDto.DateOrdered)) 
     .Add(Projections.Count(()=> items.Id).WithAlias(()=>orderDto.ItemCount)) 
    ) 
    .TransformUsing(Transformers.AliasToBean<OrderDto>()) 
    .List<OrderDto>(); 
+1

Vâng đó là chán nản. Phải chỉ định từng cột đơn lẻ sẽ là cơn ác mộng =) – BradLaney

+0

@ user745537 Có thể tin rằng đó sẽ là một nỗi đau. Tôi sẽ xem liệu tôi có thể tìm ra giải pháp nào khác không. –

+0

@ user745537 Đã có thời gian để suy nghĩ về nó và tôi không biết cách làm những gì bạn muốn. Một giải pháp khác có thể là sử dụng hai truy vấn (một cho các thực thể, một cho tổng số) và nối chúng lại với nhau trong bộ nhớ bằng LINQ. –

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