2017-02-02 4 views
2

Disons que j'ai la structure suivante, mappé avec un discriminateur (tableau par hiérarchie):NHibernate Linq requête de recherche Où (x => x est la classe de base) ne soit pas dérivés objets

Entity (abstract, no discriminator) 
     | 
    Animal (abstract, no discriminator) 
    / \ 
Dog (1) Cat(2) 

Si je fais une recherche sur ce en utilisant Linq à NHibernate:

.Where(x => x.Entity is Animal) 

Je n'obtiens aucun résultat. Lorsque l'on regarde à la requête générée je me attendais à voir:

where type in (1, 2) 

Mais au lieu que je suis ceci:

where type='animal' 

animal est abstrait et n'a même pas un discriminateur, de sorte que la requête générée est dénuée de sens. Creuser un peu plus profond J'ai trouvé que la requête est traduite en interne à quelque chose de similaire à WHERE x.class=animal dans HQL. Est-ce un bug dans Linq à NHibernate? Ou est-ce un comportement attendu?

Répondre

0

-vous obtenir le résultat attendu lors de l'utilisation

session.Query<Animal>().Select(a => a.yourXEntity).ToList() 

Ou

session.Query<Animal>().SelectMany(a => a.yourXEntityCollection).ToList() 

à la place? Ceux-là devraient gérer le polymorphisme.

Alors que votre lambda x.Entity is Animal se traduit très probablement à HQLx.Entity.class = Animal qui ne gère pas le polymorphisme et ne prend que la valeur discriminante de classe spécifiée, qui par défaut son nom de classe.

+0

Si je fais 'session.Query .ToList()' Je reçois la requête attendue, 'taper dans (1,2)'. Si je fais les questions dans votre réponse, je pense que cela fonctionne aussi. Le problème est seulement avec '.Where (x => x.Entity est Animal)'. Je pourrais faire .Where (x => session.Query () .Sélectionner (a => a.Id) .Contains (x.Entity.Id)), mais au lieu d'un simple 'où type (1,2) 'Je reçois une sous-requête complexe' where id in (sélectionnez id from ...) '. – AlexDev

1

J'ai corrigé ce bogue a ajouté cette fonctionnalité à NHibernate. Les modifications sont here et peuvent être créées à partir de la source. J'ai émis une demande de traction alors j'espère que cela va fonctionner bientôt.

Mise à jour: Il s'agissait de merged et devrait être disponible dans la prochaine version.