Ottieni un set di risultati distinto da NHibernate usando l’API dei criteri?

Sto cercando di ottenere risultati distinti utilizzando l’API Criteria in NHibernate. So che questo è ansible usando HQL, ma preferirei farlo usando l’API Criteria, perché il resto della mia app è scritto usando solo questo metodo. Ho trovato questo post sul forum , ma non sono riuscito a farlo funzionare. C’è un modo con l’API dei criteri per ottenere set di risultati distinti?

Modifica: nel fare ciò, volevo anche escludere la colonna Chiave primaria, che è anche un’identity framework, e ottenere i restanti record distinti. C’è un modo per fare questo? Così com’è, i record distinti restituiscono duplicati perché la chiave primaria è unica per ogni riga, ma tutti gli altri campi sono uguali.

Non riesci a vedere il post del forum in questo momento (link interrotto?), Quindi forse questa non è la risposta, ma puoi aggiungere un DistinctRootEntityResultTransformsr:

session.CreateCriteria(typeof(Product) .Add(...) .SetResultTransformsr(new DistinctEntityRootTransformsr()) 

Per eseguire una query distinta, è ansible impostare la proiezione sui criteri su Projections.Distinct. Quindi includi le colonne che desideri restituire. Il risultato viene quindi restituito in un object fortemente tipizzato impostando il trasformatore di risultati su AliasToBeanResultTransformsr, passando il tipo in cui il risultato deve essere trasformato. In questo esempio sto usando lo stesso tipo dell’ quadro stessa, ma potresti creare un’altra class specificatamente per questa query.

 ICriteria criteria = session.CreateCriteria(typeof(Person)); criteria.SetProjection( Projections.Distinct(Projections.ProjectionList() .Add(Projections.Alias(Projections.Property("FirstName"), "FirstName")) .Add(Projections.Alias(Projections.Property("LastName"), "LastName")))); criteria.SetResultTransformsr( new NHibernate.Transform.AliasToBeanResultTransformsr(typeof(Person))); IList people = criteria.List(); 

Questo crea SQL simile a (in almeno SQL Server):

 SELECT DISTINCT FirstName, LastName from Person 

Si prega di essere consapevoli del fatto che solo le proprietà specificate nella proiezione verranno compilate nel risultato.

Il vantaggio di questo metodo è che il filtro viene eseguito nel database anziché restituire tutti i risultati all’applicazione e quindi eseguire il filtro, ovvero il comportamento di DistinctRootEntityTransformsr.

Per quello che vale, NHibernate: l’ottimizzazione delle query con le proiezioni mi ha aiutato sostanzialmente con questo stesso problema.

Stiamo usando il mezzo più moderno, potente e incredibilmente piccolo per gestire questo … leggi solo se sei preparato per il fantastico … e NON ha NIENTE da fare con i criteri …

 CurrentSession() .QueryOver .Where(...) .TransformUsing(Transformsrs.DistinctRootEntity) 

Quindi, se siete venuti qui sperando in un modo per farlo, evitate di fare scherzi con i Criteria anche se voi dovreste assolutamente andare in quella direzione solo per aggiungere “DISTINCT” nel vostro SQL … non cercate oltre

Ho anche incontrato il problema del numero non distinto di elementi (io uso un recupero = “join” nel mio file di mapping). Ho usato Linq To Nhibernate per risolvere il problema, che viene utilizzato nel modo seguente:

  var suppliers = (from supplier in session.Linq() from product in supplier.Products where product.Category.Name == produtCategoryName select supplier).ToList().Distinct();