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.
Duplizieren: http://stackoverflow.com/questions/1192041/converting-hibernate-linq-query-to-hql – Paco
Nicht ganz. Ich habe diese Frage auch bemerkt und sogar beantwortet. – mark