2011-01-04 13 views
6

Mam kwerendę, która pracowała w NHibernate LINQ 2.1.2 ale to jest rzucanie NotSupportedException NH3:NHibernate 3 LINQ przyłączyć wewnętrzny problem z trzech skoków: 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; 

Relacje są jak:

  • Flower Referencje Stem
  • macierzyste hasMany Kwiaty
  • liści Referencje Stem
  • Pytanie HasMany Leaves

Wyjątek jest generowany z wiersza 204 w NHibernate.Linq.Visitors.QueryModelVisitor. Oto metoda z kodu źródłowego:

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); 
    } 

Wydaje mi się ten sam problem jest omawiany w ramach wątku:

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

ramach tego wątku Stefan wspomina, że ​​składnia nie jest obsługiwana :

dostawca LINQ spodziewa wyrażenie być:

QuerySourceReferenceExpression. Użytkownik

Jednak w przypadku z BRW w loan.Application.Borrowers ona:

QuerySourceReferenceExpression. Członek. Członek

Jest to z pewnością nieobsługiwana funkcja .

Czy ta składnia będzie obsługiwana w dowolnym momencie w NH3 LINQ? Myślę, że jest to trywialna składnia i dobrze jest mieć.

Jednak mogę obejść ten problem przez przepisywanie kwerendy jako:

 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, ktoś ma lepszy obejście?

nhusers link: http://groups.google.com/group/nhusers/browse_thread/thread/334a53c749b0b377

Odpowiedz

1

Po tym wszystkim, że wysiłek włożony w Twoje pytanie:

jest składnia ta będzie obsługiwana każdej chwili w NH3 LINQ?

... po prostu nie można odpowiedzieć na tym forum. NHibernate nie jest produktem komercyjnym z mapą drogową. Nie możesz po prostu napisać tutaj i mieć nadzieję, że jeden z twórców wolontariuszy zareaguje.

Pamiętaj, że NHibernate jest open source, więc społeczność (w tym ty!) Ma takie problemy.

Podążałem za listą nhibernate-development i wygląda na to, że dostawca LINQ jest głównym obszarem pracy. Jednak nie wiem, czy zajmie się Pan konkretnym problemem. Najlepszym sposobem na zwiększenie szansy na rozwiązanie tego problemu jest zgłoszenie błędu w NHibernate JIRA wraz z przypadkiem testowym pokazującym problem.

Jeśli nie wygląda na to, że zostanie rozwiązany konkretny problem, to dlaczego nie, download the source code i spróbujesz go samemu naprawić i/lub omówić dalej na liście mailingowej? Jeśli pobierzesz kod źródłowy i trochę go użyjesz, okaże się, że ma mnóstwo świetnych przykładowych przypadków testowych, które możesz wykorzystać jako przykłady podczas zgłaszania błędu.

+0

Opieki wyjaśnić -1? Zaproponowałem użyteczne sugestie dotyczące tego, w jaki sposób problem może zostać wyświetlony i/lub ostatecznie rozwiązany. Tylko dlatego, że jest to odpowiedź, której nie chcesz słyszeć, nie oznacza, że ​​powinna zostać odrzucona. ;-) – mpontillo

+3

dostaniesz mój głos. Wielu ludzi .Net myśli o OSS tak samo jak komercyjnych aplikacjach i nigdy nie zastanawia się, w jaki sposób mogą się wesprzeć. (Mimo, że powiedział, że nawet jako doświadczony programista, baza kodu NH jest onieśmielająca) –

+1

Właśnie znalazłem [ten artykuł] (http://nhforge.org/blogs/nhibernate/archive/2008/10/04/the-best- way-to-solve-nhibernate-bugs-submit-good-unit-test.aspx), które mogą być pomocne podczas przechodzenia przez tę ścieżkę. – mpontillo

1

nie testowałem dokładną przykład, ale miałem podobny problem w NH 3.2 i stwierdził, że jest został rozwiązany w NH 3.3