J'avais le même besoin: j'avais besoin de supprimer en utilisant une expression LINQ, mais NHibernate ne supporte que la suppression en utilisant HQL ou SQL. Je n'aime pas cette approche, car le reste du code est complètement typé avec l'expression LINQ, et je devais ensuite établir un lien avec les noms de tables et de propriétés et manipuler les chaînes.
Je travaille avec NHibernate 3.0 et je suis arrivé à 95% du chemin, mais j'ai dû utiliser la réflexion pour appeler certaines méthodes privées/internes sur le chemin. Le dessous me donne un objet HqlQuery pour l'expression 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;
}
Je suis coincé sur que je ne suis pas en mesure de convertir l'objet HqlQuery à une chaîne HQL. Quelqu'un a-t-il des commentaires à ce sujet? Ou avez-vous résolu votre problème d'une manière différente?
Quoi qu'il en soit, je pense que cela pourrait être un excellent ajout d'avoir une surcharge de ISession.Delete, qui a pris un IQueryable ou IQuery en paramètre. Je suis un débutant pour NHibernate, mais il me semble que ce devrait être une tâche assez simple pour quelqu'un qui sait NHibernate de trouver des méthodes déjà existantes et de les connecter pour faire le travail.
Dupliquer: http://stackoverflow.com/questions/1192041/converting-hibernate-linq-query-to-hql – Paco
Pas tout à fait. J'ai également remarqué cette question et même répondu. – mark