2011-01-16 38 views
11

Tôi cố gắng để chạy truy vấn LINQ dưới đây với nHibernate 3.nHibernate 3 - Left Join tái LINQ giải pháp

var items = from c in session.Query<tbla>() 
     join t in session.Query<tblb>() on c.Id equals t.SomeId into t1 // use left join on trades. 
     from t2 in t1.DefaultIfEmpty() 
select new {item = c, desc = t2.Description}; 

Đây là cách chứng khoán để thực hiện một trái tham gia trong LINQ to hiểu biết của tôi. Tuy nhiên nó cho tôi một thông báo ngoại lệ không được hỗ trợ. Làm thế nào tôi có thể đạt được một tham gia trái cơ bản mà không cần phải trở lại HQL? Điều này có vẻ hơi ngớ ngẩn mà một ORM như thịnh hành như nHibernate không thể hỗ trợ một cái gì đó như là người đi bộ như một tham gia trái.

[sửa]

Tôi đã đặt câu trả lời thực sự cho câu hỏi của riêng mình bên dưới.

+0

Tôi bị mất. Các giá trị tương đương cho "trên c.Id bằng t.SomeId thành t1" và "new {item = c, desc = t2.Description}" trong ví dụ này là gì? Bạn có thể mở rộng ví dụ và/hoặc nhận xét không? – mayu

+0

Câu trả lời được chấp nhận là sai. Tại sao bạn không gửi câu trả lời của riêng bạn? Tôi sẽ bầu cho nó. – mayu

+0

Cuộc gọi tốt, tôi đã chuyển bản chỉnh sửa của tôi thành câu trả lời. Phép thuật tham gia xảy ra trong mệnh đề 'SelectList' của biểu thức đó. Hy vọng rằng sẽ giúp. Truy vấn thứ hai không phải là một logic đối sánh chính xác một cách khôn ngoan cho truy vấn đầu tiên, do đó không có táo để so sánh táo ở đó. – James

Trả lời

8

Sau khi nghiên cứu thêm về điều này; điều này là có thể (mặc dù không rõ ràng) để đạt được trong một thời trang gõ mạnh mẽ sử dụng QueryOver. Bí quyết là sử dụng các biến bí danh truy vấn bên ngoài kết hợp với WithAlias ​​và TransformUsing. Đây là một ví dụ mà không tham gia với lọc và phân loại.

// Query alias variables 
entityTypeA anchorType = null; 
entityTypeB joinedType = null; 

var items = session.Query<entityTypeA>(()=>anchorType) 
      .Left.JoinAlias(() => anchorType.FieldName,() => joinedType) 
      .WithSubquery.WhereProperty(e => e.FieldD).In(myFilterList) 
      // bind property mappings using WithAlias 
      .SelectList(list => list 
         .Select(e => e.FieldNameA).WithAlias(()=> anchorType.FieldNameA) 
         .Select(e => e.FieldNameB).WithAlias(()=> anchorType.FieldNameB) 
         ) 
      .OrderBy(e => joinedType.FieldNameC).Desc 
      .TransformUsing(Transformers.AliasToBean<entityTypeA>()) // transform result to desired type. 
      .List<entityTypeA>(); 
+1

Có một vấn đề với cách tiếp cận đó: thực thể truy xuất của bạn thực sự hoạt động giống như DTO (tức là nó không được theo dõi) –

+0

Vì vậy, nếu chúng cần cập nhật giải pháp này sẽ không hoạt động? –

1

Chưa được hỗ trợ. HQL là lựa chọn duy nhất của bạn vào lúc này.

+0

Cảm ơn tôi đã sợ điều đó. Có lẽ một cách khác không thay thế hql làm điều này tức là subquery w/nơi bên ngoài khoản vv? – James

+1

Có lẽ ... nhưng tôi sẽ sử dụng HQL đơn giản thay vì LINQ phức tạp ... –