2011-01-04 30 views
6

Tôi có một truy vấn mà đã từng làm việc trong NHibernate LINQ 2.1.2 nhưng nó được ném NotSupportedException với NH3:NHibernate LINQ 3 bên tham gia vấn đề với ba bước nhảy: NotSupportedException

IQueryable<Tree> query = from flower in GetSession().Query<Flower>() 
          from leaf in flower.Stem.Leaves // <--- the problem is here with three jumps 
          where leaf.Color == Green 
          select flower; 

Quan hệ cũng giống như:

  • Flower Tài liệu tham khảo gốc
  • gốc HasMany Flowers
  • Leaf Tài liệu tham khảo gốc
  • Thân cây HasMany Lá

Ngoại lệ được ném từ dòng 204 trong NHibernate.Linq.Visitors.QueryModelVisitor. Dưới đây là phương pháp từ mã nguồn:

public override void VisitAdditionalFromClause(AdditionalFromClause fromClause, QueryModel queryModel, int index) 
    { 
     if (fromClause is LeftJoinClause) 
     { 
      // It's a left join 
      _hqlTree.AddFromClause(_hqlTree.TreeBuilder.LeftJoin(
           HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters).AsExpression(), 
           _hqlTree.TreeBuilder.Alias(fromClause.ItemName))); 
     } 
     else if (fromClause.FromExpression is MemberExpression) 
     { 
      var member = (MemberExpression) fromClause.FromExpression; 

      if (member.Expression is QuerySourceReferenceExpression) 
      { 
       // It's a join 
       _hqlTree.AddFromClause(_hqlTree.TreeBuilder.Join(
            HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters).AsExpression(), 
            _hqlTree.TreeBuilder.Alias(fromClause.ItemName))); 
      } 
      else 
      { 
       // What's this? 
       throw new NotSupportedException(); // <--------- LINE 204 
      } 
     } 
     else 
     { 
      // TODO - exact same code as in MainFromClause; refactor this out 
      _hqlTree.AddFromClause(_hqlTree.TreeBuilder.Range(
           HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters), 
           _hqlTree.TreeBuilder.Alias(fromClause.ItemName))); 

     } 

     base.VisitAdditionalFromClause(fromClause, queryModel, index); 
    } 

Dường như với tôi cùng một vấn đề được thảo luận dưới các chủ đề sau:

http://groups.google.com/group/nhusers/browse_thread/thread/dbceb7eb1e31f027/f8e69671b750e0d6?lnk=gst&q=NotSupportedException+stefan#f8e69671b750e0d6

Dưới rằng thread Stefan nói rằng cú pháp không được hỗ trợ :

các nhà cung cấp LINQ hy vọng sự biểu hiện là:

0.123.

QuerySourceReferenceExpression. Thành viên

Tuy nhiên, trong trường hợp từ BRW trong loan.Application.Borrowers nó là:

QuerySourceReferenceExpression. Hội viên . Thành viên

Vì vậy, nó chắc chắn là một tính năng không được hỗ trợ .

Vì vậy, cú pháp này có được hỗ trợ bất cứ lúc nào trong NH3 LINQ không? Tôi nghĩ rằng đó là một cú pháp tầm thường và nó là tốt để có.

Tuy nhiên tôi có thể đi xung quanh vấn đề này bằng cách viết lại các truy vấn như:

 IQueryable<Tree> query = from stem in GetSession().Query<Stem>() 
           from leaf in stem.Leaves 
           from flower in stem.Flowers 
           where leaf.Color == Green 
           select flower; 

BTW, bất cứ ai có một cách giải quyết tốt hơn?

nhusers liên kết: http://groups.google.com/group/nhusers/browse_thread/thread/334a53c749b0b377

Trả lời

1

Sau tất cả những nỗ lực đưa vào, câu hỏi của bạn:

được cú pháp này sẽ được hỗ trợ bất cứ lúc nào trong NH3 LINQ?

... không thể trả lời được trong diễn đàn này. NHibernate không phải là một sản phẩm thương mại với lộ trình. Bạn không thể chỉ đăng bài ở đây và hy vọng một trong những nhà phát triển tình nguyện phản hồi.

Hãy nhớ rằng NHibernate là nguồn mở, vì vậy cộng đồng (kể cả bạn!) Sở hữu các vấn đề như thế này.

Tôi đã theo dõi danh sách nhibernate-development và có vẻ như nhà cung cấp LINQ là một lĩnh vực hoạt động chính. Tuy nhiên, tôi không biết liệu vấn đề cụ thể của bạn có được giải quyết hay không. Cách tốt nhất để tăng cơ hội của sự cố này đang được khắc phục là gửi một lỗi trong NHibernate JIRA cùng với một trường hợp kiểm tra hiển thị sự cố.

Nếu nó không giống như vấn đề cụ thể của bạn sẽ được giải quyết, tại sao không download the source code và cố gắng sửa chữa nó, và/hoặc thảo luận thêm về danh sách gửi thư? Nếu bạn tải xuống mã nguồn và làm việc với nó một chút, bạn cũng sẽ thấy rằng nó có rất nhiều trường hợp thử nghiệm ví dụ tuyệt vời mà bạn có thể sử dụng làm ví dụ khi bạn gửi lỗi.

+0

Chăm sóc để giải thích -1? Tôi đã cung cấp các đề xuất hữu ích về cách vấn đề có thể kết thúc để có được khả năng hiển thị và/hoặc cuối cùng được giải quyết. Chỉ vì đó là câu trả lời mà bạn không muốn nghe không có nghĩa là nó sẽ bị bỏ phiếu. ;-) – mpontillo

+3

bạn nhận được phiếu bầu của tôi. Rất nhiều người .Net nghĩ về PMNM giống như các ứng dụng thương mại và không bao giờ nghĩ về cách họ có thể tự đóng góp. (Mặc dù, điều đó nói rằng, ngay cả khi một nhà phát triển có kinh nghiệm, các codebase NH là đáng sợ) –

+1

Chỉ cần tìm thấy [bài viết này] (http://nhforge.org/blogs/nhibernate/archive/2008/10/04/the-best- cách-to-giải-nhibernate-bugs-submit-tốt-đơn vị-test.aspx) mà có thể hữu ích khi đi xuống con đường này. – mpontillo

1

Chưa thử nghiệm ví dụ chính xác của bạn nhưng tôi đã gặp sự cố tương tự trong NH 3.2 và thấy rằng đã được giải quyết trong NH 3.3

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