2011-10-07 30 views
10

Tôi có một bảng trong C# và ASP.net tham khảo danh sách một bảng khác nơi một số người đăng ký xe được ánh xạ tới một chiếc xe duy nhất. Tôi không muốn đi qua toàn bộ bộ sưu tập người đăng ký xe bằng cách truy cập các thành viên cá nhân của họ (ví dụ: vehicleRegistrantsAlias[0]), bởi vì tôi không biết sẽ có bao nhiêu người.Tham gia tuyên bố cho một danh sách

Tôi có cần thực hiện điều này trong hai truy vấn không? Tôi thực sự muốn làm tất cả trong một. Tôi có lớp cha mẹ là xe và một bộ sưu tập con của người đăng ký xe. Người đăng ký xe là loại cơ sở và người đăng ký xe là chủ sở hữu và nhà điều hành. Tôi cũng muốn lấy thông tin từ các bảng con khác. Tôi đang tham gia từ phương tiện để người lái xe có thể hoạt động tốt; tuy nhiên, tôi cũng muốn kéo chủ sở hữu và người làm việc.

Vehicle vehicleAlias = null; 
List<VehicleRegistration> vehicleRegistrationsAlias = null; 
List<VehicleRegistrant> vehicleRegistrantsAlias = null; 

.JoinAlias(() => vehicleAlias.VehicleRegistrations,() => vehicleRegistrationsAlias) 
.JoinAlias(() => vehicleAlias.VehicleRegistrants,() => vehicleRegistrantsAlias) 

//from vehicle registrants 
.JoinAlias(() => vehicleRegistrantsAlias[0].,() => vehicleSuspensionTypeAlias) 
+0

Tôi có thể làm điều này rõ ràng hơn không? Tôi sẽ rất vui khi xây dựng. – joncodo

+0

bạn đang tìm kiếm gì hoặc sql bạn muốn có trông như thế nào? – Firo

+0

Các sql sẽ nhận được tất cả các thông tin của trẻ em hình thành bộ sưu tập của trẻ em. Sắp xếp giống như vòng lặp foreach bên trong câu lệnh nối. Tôi có thể tham gia vào bộ sưu tập của trẻ em và không chỉ là đứa trẻ độc thân? – joncodo

Trả lời

2

Bạn có thể sử dụng LINQ to NHibernate là tốt, nó thường làm cho các truy vấn dễ hiểu hơn API QueryOver.

Căn cứ ý kiến, tôi đoán bạn muốn có một chức năng với các chữ ký sau:

public Vehicle GetVehicle(VehicleRegistrant registrant) 
{ 
    var vehicle = session.Query<Vehicle>() 
         .FetchMany(x => x.VehicleRegistrants) 
         .ThenFetch(x => x.Owner) 
         .Where(x => x.VehicleRegistrants.Contains(registrant)) 
         .SingleOrDefault(); 
} 

Hoặc, nếu bạn có một mối quan hệ theo hướng từ VehicleRegistrant để mẹ Vehicle, điều này cũng sẽ làm việc

public Vehicle GetVehicle(VehicleRegistrant registrant) 
{ 
    var vehicle = session.Query<Vehicle>() 
         .FetchMany(x => x.VehicleRegistrants) 
         .ThenFetch(x => x.Owner) 
         .Where(x => x == registrant.Vehicle) 
         .SingleOrDefault(); 
} 

Tôi không chắc chắn nếu điều này là chính xác những gì bạn muốn, nhưng tôi tin rằng bạn có được ý tưởng. FetchMany(x => x.VehicleRegistrants) yêu cầu NHibernate cũng tìm nạp tất cả các VehicleRegistrants cho mỗi Vehicle trong tập kết quả và ThenFetch(x => x.Owner) sau đây cho biết "và đối với mỗi số trong số VehicleRegistrants, cũng tìm nạp Owner" của nó.

Điều này có hữu ích không?

0

Thay đổi biến để:

VehicleRegistration vehicleRegistrationsAlias = null; 
    VehicleRegistrant vehicleRegistrantsAlias = null; 

Thay đổi JoinAlias ​​dòng để:

.JoinAlias(() => vehicleAlias.VehicleRegistrations,() => vehicleRegistrationsAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin) 
.JoinAlias(() => vehicleAlias.VehicleRegistrants,() => vehicleRegistrantsAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin) 

Và truy vấn háo hức sẽ lấy.

Cũng nên gọi trước khi liệt kê:

.TransformUsing(Transformers.DistinctRootEntity) 
Các vấn đề liên quan