2009-08-25 6 views
1

Kennt jemand eine vorhandene Lösung zum Übersetzen eines LINQ-Ausdrucks in eine HQL-Anweisung?Kann jemand LINQ-Ausdruck in NHibernate HQL-Anweisung übersetzen?

Vielen Dank im Voraus an alle guten Samariter da draußen.

P.S.

Wir verwenden bereits Linq zu NHibernate. Es funktioniert jedoch nur für SELECT-Anweisungen, während HQL für andere Anweisungsarten wie delete gut ist. Also, Linq zu NHibernate ist nicht die Antwort.

+0

Duplizieren: http://stackoverflow.com/questions/1192041/converting-hibernate-linq-query-to-hql – Paco

+1

Nicht ganz. Ich habe diese Frage auch bemerkt und sogar beantwortet. – mark

Antwort

2

Linq zu Nhibernate wurde gerade released. Hilft das?

+0

Ich benutze es bereits. Es kann nur selects auswählen, während HQL in anderen Operationen wie delete verwendet werden kann. Also nein, es hilft nicht. – mark

+0

oh ok. Ich schlage vor, dass Sie Ihre Frage entsprechend bearbeiten. –

0

Verwenden Sie LINQ zum Abfragen, HQL zum Löschen und Aktualisieren. Gerade Kriterien können manchmal anstelle von LINQ nützlich sein.

Es ist keine Entweder-Oder-Situation, Sie können und sollten das beste Werkzeug für jeden Job auswählen.

+0

HQL ist NHibernate-spezifisch und als solches das DAL-Implementierungsdetail auf der Serverseite. Ich möchte nicht, dass es auf die Client-Seite "leckt", die die Löschung einiger Entitäten anfordert. Daher gibt der Client einen linq-Ausdruck an. Wenn die Anfrage abgerufen wird - einfach, weil es Linq zu Nhibernate gibt, die es in Kriterien übersetzen und dann von ihm auswählt. Es gibt jedoch keine Löschanweisung nach Kriterien und das ist ein Problem. – mark

+1

Das ist eine ganz andere Frage ... bitte erstellen Sie eine andere Frage, um das zu beheben. Wenn Sie mehrere Ebenen IMO verwenden, sollten Sie nicht zulassen, dass ein Client seinen eigenen linq-Ausdruck sendet. –

+0

http://stackoverflow.com/questions/1330432/in-a-multitier-application-should-a-client-be-allowed-to-send-its-own-linq-expres – mark

1

Ich hatte genau das gleiche Bedürfnis: Ich musste mit einem LINQ Ausdruck löschen, aber NHibernate unterstützt nur löschen mit HQL oder SQL. Ich mag diesen Ansatz nicht, da der restliche Code vollständig mit dem LINQ-Ausdruck typisiert ist und ich mich dann auf Tabellen- und Eigenschaftsnamen und die Manipulation von Strings beziehen musste.

Ich arbeite mit NHibernate 3.0 und ich kam 95% des Weges, aber ich musste Reflexion verwenden, um einige private/interne Methoden auf dem Weg zu nennen. Das unten gibt mir ein HqlQuery Objekt für den Ausdruck LINQ:

NhQueryable<Product> queryable = (from p in session.Query<Product>() 
          where p.ProductId == 1 
          select p) as NhQueryable<Product>; 
      if (queryable != null) 
      { 
       Expression expression = queryable.Expression; 
       NhQueryProvider provider = queryable.Provider as NhQueryProvider; 
       MethodInfo prepareQueryMethod = typeof(NhQueryProvider).GetMethod("PrepareQuery", BindingFlags.Instance | BindingFlags.NonPublic); 
       object[] arguments = new object[] {expression, null, null}; 
       NhLinqExpression nhLinqExpression = prepareQueryMethod.Invoke(provider, arguments) as NhLinqExpression; 
       ExpressionToHqlTranslationResults translationResults = nhLinqExpression.ExpressionToHqlTranslationResults; 
       HqlQuery hql = translationResults.Statement as HqlQuery; 
      } 

Ich bin fest auf, dass ich nicht in der Lage, das HqlQuery Objekt in ein HQL-String zu konvertieren. Hat jemand dazu etwas zu sagen? Oder hast du dein Problem anders gelöst?

Wie auch immer ich denke, es könnte eine große Ergänzung sein, eine Überladung von ISession.Delete zu haben, die ein IQueryable oder IQuery als Parameter nahm. Ich bin ein Neuling für NHibernate, aber es scheint mir, es sollte eine ziemlich einfache Aufgabe für jemanden sein, der NHibernate kennt, um einige bereits existierende Methoden zu finden und sie zu verbinden, um die Arbeit zu machen.

+0

Ich habe mir die Freiheit genommen, Ihre Ergebnisse auf der engagierten NH-Mailingliste. Es gibt etwas Verkehr um diesen Beitrag - Ihre Aktion ist erforderlich. Die Post-URL lautet http://groups.google.com/group/nhusers/browse_thread/thread/07cff495aa5f12e1 – mark