Limita la raccolta per recuperare solo le voci recenti per l’entity framework readonly

L’entity framework utente può avere migliaia di UserOperations. A volte non voglio recuperare (per entity framework readonly) tutti ma solo “i 10 recenti O non completati”.

public class SimpleForm { public class User : EntityBase { // ... private ISet _recentOperations = new HashedSet(); public virtual ISet RecentOperations { get { return _recentOperations; } set { _recentOperations = value; } } } } 

Quindi, come posso specificarlo? Penso che potrei usare l’override della mapping?

Capisco che potrei fare questo con una query separata, ma può essere fatto dalla mapping delle entity framework?

Inoltre mi chiedo se c’è una possibilità di fare l’un po ‘per quadro non readonly dove posso modificare la raccolta di operazioni?

AGGIORNARE

Ho provato a usare

 DateTime dateTime = (DateTime.UtcNow - TimeSpan.FromDays(15)); mapping.HasMany(x => x.RecentOperations) .Where(x => x.EndedAt == null || x.EndedAt < dateTime); 

ma dice “Imansible convertire l’espressione in SQL”.

L’ho sostituito con

 mapping.HasMany(x => x.RecentOperations) .Where(x => x.EndedAt == null); 

e ora getta l’eccezione di riferimento null all’interno

in FluentNHibernate.Utils.ExpressionToSql.Convert (valore dell’object) in FluentNHibernate.Utils.ExpressionToSql.Convert (espressione di ConstantExpression) in FluentNHibernate.Utils.ExpressionToSql.Convert [T] (espressione Expression`1, espressione UnaryExpression)

Esistono 2 modi generali su come filtrare le raccolte mappate.

Il primo è un po ‘rigido, fisso, in una mapping definita where="" clausola:

  • 6.2. Mappatura di una raccolta (… fluente. .Where(bool expr) o. .Where(Sql statement string)

Il secondo e forse davvero adatto in questo scenario, è la versione dynamic chiamata filtro:

  • 18.1. Filtri NHibernate

NHibernate aggiunge la possibilità di pre-definire i criteri di filtro e colbind tali filtri sia a una class che a un livello di raccolta. Un criterio di filtro è la capacità di definire una clausola di restrizione molto simile all’attuale attributo “where” disponibile sulla class e sui vari elementi di raccolta. Tranne che queste condizioni di filtro possono essere parametrizzate. L’applicazione può quindi decidere in fase di esecuzione se i filtri devono essere abilitati e quali dovrebbero essere i valori dei parametri. I filtri possono essere utilizzati come viste del database, ma parametrizzati all’interno dell’applicazione ….

L’implementazione in fluente sarebbe simile a questa:

 public class RecentFilter : FilterDefinition { public RecentFilter() { WithName("RecentFilter") .WithCondition("( :EndedAtDate IS NULL OR EndedAt < :EndedAtDate )") .AddParameter("EndedAtDate",NHibernate.NHibernateUtil.DateTime); } } 

questo è il filtro, ed ecco il suo uso in una mapping fluente:

 mapping .HasMany(x => x.RecentOperations) ... .ApplyFilter(); 

In runtime, possiamo triggersre / distriggersre il filtro a livello di ISession:

 session.EnableFilter("RecentFilter") .SetParameter("EndedAtDate",DateTime.Now.AddDays(-15)); 

Guarda anche:

  • filtro di proprietà con automapping fluente di nibibre
  • Sintassi per definire un filtro NHibernate con Fluent Nhibernate?
  • È ansible utilizzare i filtri NHibernate per filtrare attraverso i riferimenti?