Im utilisant NHibernate4 et Oracle 12. NHibernate configuré pour utiliser Oracle10gDialect.NHibernate - Sélectionner les enregistrements par date du serveur
Premier code associé.
public class WorkOrder
{
........
public virtual DateTime CreationDate {get; set;}
........
}
CreationDate mappée comme:
Map(x => x.CreationDate)
.Column("CREATION_DATE")
.CustomType("DateTime")
.Access.Property()
.Generated.Never()
.CustomSqlType("DATE")
.Not.Nullable();
échantillons de requête:
var workOrders1 = session.Query<WorkOrders>()
.Where(p => DateTime.Today.Date.Equals(p.CreationDate.Date))
.ToList();
var workOrders2 = session.Query<WorkOrders>()
.Where(p => p.CreationDate.Date == DateTime.Today.Date)
.ToList();
var workOrders3 = session.Query<WorkOrders>()
.Where(p => p.CreationDate.Date.Equals(DateTime.Today.Date))
.ToList();
Toutes les requêtes LINQ ci-dessus converties en sql comme ceci:
select workorders0_.CREATION_DATE as CREATION11_
from APPS.WORK_ORDERS workorders0_
where TIMESTAMP '2016-04-16 00:00:00' /* :p0 */ = trunc(workorders0_.CREATION_DATE)
Ces requêtes utilise les ordinateurs clients l'heure du système (et en tant que paramètre), pas le temps système des serveurs. Je préfère toujours utiliser l'heure du serveur. Pour la base de données oracle sur laquelle je travaille, je préfère "sysdate" car le champ "CreationDate" est défini par by avant le déclencheur d'insertion en utilisant la fonction "sysdate".
NHibernate peut-il utiliser le datetime du serveur directement? et le paramètre n'est pas requis. Comme:
select workorders0_.CREATION_DATE as CREATION11_
from APPS.WORK_ORDERS workorders0_
where trunc(sysdate) = trunc(workorders0_.CREATION_DATE)
En résumé, la partie "où" doit être changée du premier au second. la version NHibernate est v4.0.30319
where TIMESTAMP '2016-04-16 00:00:00' /* :p0 */ = trunc(workorders0_.CREATION_DATE)
where trunc(sysdate) = trunc(workorders0_.CREATION_DATE)
Merci beaucoup. Mais je reçois Une exception non gérée de type 'System.NotSupportedException' s'est produite dans NHibernate.dll Informations supplémentaires: PartialEvalException (NotImplementedException ("La méthode ou l'opération n'est pas implémentée."), PartialEvalException (NotImplementedException (" La méthode ou l'opération n'est pas implémentée. "), GetSysDate()). Date) J'ai recherché cette méthode et cela doit fonctionner.J'ai fait des tests avec différents oracledialects rien changé – ayocak
mes propres tests, et oui, son apparence cet attribut d'extension ne supporte pas les fonctions sans paramètre ... Assez malheureux.Je peux appeler n'importe quelle fonction ayant des paramètres, y compris ceux définis par l'utilisateur (y compris leur schéma dans leur nom). en ajoutant une fonction définie par l'utilisateur ayant un paramètre fictif qui appelle le paramètre less function.Je suis toujours à la recherche d'une meilleure solution.Il semble qu'il doit être appelé sur une propriété d'entité mappée.C'est une grande limitation.O –
Je n'ai rien trouvé de mieux J'ai mis à jour ma réponse en conséquence –