Répondre
Utilisation Projection:
session.CreateCriteria(typeof(Customer))
.SetProjection(Projections.Max("Id"))
. UniqueResult();
Max (id) + 1 est une très mauvaise pour générer ids. Si c'est votre objectif, trouvez un autre moyen de générer des identifiants.
Edit: en réponse à LnDCobra:
c'est mauvais parce qu'il est difficile de faire en sorte que le max (id), vous avez encore le max (id) lorsque vous faites l'insert. Si un autre processus insère une ligne, votre insertion aura le même identifiant et votre insertion échouera. (Ou, inversement, l'insertion de l'autre processus échouera si votre insertion est passée en premier.)
Pour éviter cela, vous devez empêcher d'autres insertions/faire votre get et l'insertion ultérieure atomique, ce qui signifie généralement le verrouillage de la table, qui va nuire à la performance.
Si vous vous verrouillez uniquement contre les écritures, l'autre processus obtient max (id), qui est le même max (id) que vous avez. Vous faites votre insertion et libérez le verrou, il insère un ID en double et échoue. Ou il essaie de se verrouiller aussi, auquel cas il vous attend. Si vous vous bloquez contre les lectures, tout le monde vous attend. Si elle se bloque aussi contre les écritures, alors elle n'insère pas l'identifiant dupliqué, mais elle attend votre lecture et votre écriture.
(Et il brise l'encapsulation: vous devez laisser les SGBDR comprendre ses ids, pas les programmes clients qui s'y connectent.)
En général, cette stratégie soit:
* BREAK
* nécessitent une tas de code « plomberie » pour le faire fonctionner
* réduire considérablement les performances
* ou les trois
et il sera plus lent, moins robuste, et nécessitent plus difficile de maintenir le code que d'utiliser simplement les années SGBDR construites dans des séquences ou des identifiants d'auto-incrémentation générés.
Quelqu'un peut-il me diriger dans les bonnes directions quant à pourquoi ne pas l'utiliser pour générer des ID, et si oui une meilleure façon ...? –
meilleure approche est de faire table des séquences supplémentaires. Où vous pouvez gérer la cible et la valeur de la séquence. OwnerId - lorsque vous avez besoin de gérer différentes séquences pour la même entité, en fonction d'un type de propriétaire. Par exemple vous devez maintenir la numérotation pour le document dans le contrat, puis OwnerId will be = contractId
- 1. Nhibernate Criteria API
- 2. Criteria building nhibernate
- 3. NHibernate Criteria création de requêtes
- 4. SPARQL select RDF: ID
- 5. Comment récupérer des entités uniques via l'API NHibernate Criteria?
- 6. SQL - SELECT MAX() et le champ d'accompagnement
- 7. Mappage NHibernate sans ID
- 8. Nhibernate mapping sans ID
- 9. Performance entre SELECT MAX (nom_colonne) et ROWNUM = 1
- 10. La requête la plus performante pour "select max in group"?
- 11. Est-ce que l'API NHibernate Criteria prend en charge les projections sur les propriétés de collection?
- 12. MAX (ID) dans SQL Server 2005 renvoyant des résultats inattendus
- 13. requête simple à Grab Max Value pour chaque ID
- 14. NHibernate: set id I interface cartographique
- 15. NHibernate N + 1 select: solution architecturale?
- 16. groupe SQL par & Max
- 17. MySQL efficace de requête « select id insérer autre »
- 18. SQL SERVER, instruction SELECT avec auto générer la ligne id
- 19. SQL SELECT DISTINCT ID de copies ORDER BY CID
- 20. Comment écrire SELECT FROM myTable WHERE id IN (SELECT ...) dans Linq?
- 21. Hibernate Criteria API - HAVING clause work contourne
- 22. Comment faire une expression "NOT IN" en utilisant l'API Criteria dans NHibernate?
- 23. Obtenir un jeu de résultats distinct à partir de NHibernate à l'aide de l'API Criteria?
- 24. Aide MySQL: SELECT table2.id O WH ... table1.date est la plus grande
- 25. requête simple avec "OU" clause (API Criteria)
- 26. Linq (MIN MAX &&)
- 27. NHibernate - Composite-Id sur la relation - Lorsque ID de parent est pas même composite
- 28. Mysql Max requête
- 29. fluent nhibernate auto increment non key (Id) propriété
- 30. NHibernate - parent économie quand j'ai ID d'Enfants ne
Quel est le type de retour de cette expression? – IanT8
Un objet. Vous pouvez utiliser la surcharge UniqueResult pour la convertir en un type spécifique. Dans ce cas, vous devez utiliser UniqueResult () pour le convertir en entier. –