Domanda

Per favore perdonami se non sono un po 'poco chiaro, sto solo iniziando con le espressioni Nhibernate/Linq/Lambda, e in realtà non sono sicuro di cosa cercare ...

Ho lavorato con .NET 2.0 negli ultimi 4 o 5 anni e non ho avuto l'opportunità di evolversi se non da solo, motivo per cui ora sto imparando la nuova tecnologia :)

Ho letto molti blog e post e ho iniziato un piccolo progetto personale in cui provo a utilizzare il modello di repository nel miglior modo possibile.

Ora sono nella seguente situazione:

  • Myproject.core.dll: Ho questo assemblaggio di base che contiene tutta la logica aziendale e imposta il contratto irepository. Non sa nulla dell'effettiva implementazione del repository, viene risolto in fase di esecuzione usando il IOC, quindi questa DLL core non ha alcun riferimento alle DLL NHIBERNATE.
  • Myproject.data.nhibernate.dll: L'implementazione del repository è contenuta all'interno di questa assembly che ha tutti i riferimenti necessari alle DLL NHIBERNATE.

L'implementazione del mio repository assomiglia a questo:

public class GenericRepository<T> : IGenericRepository<T> where T : class
{
    ...
    public virtual IQueryable<T> All()
    {
        IList<T> entities = Session
            .CreateCriteria( typeof( T ) )
            .List<T>();
        return entities.AsQueryable<T>();
    }
    ...
}

Quindi nella mia DLL principale posso ottenere un riferimento al mio repository e fare qualcosa come:

IList<Person> people = myRepository.All().ToList();

Sembra funzionare bene, interroga il database e restituisce tutte le righe dalla tabella della persona.

Tuttavia, ora quello che voglio fare è aggiungere predicati:

IList<Person> daves = myRepository.All().Where(p => p.Name == "Dave").ToList();

Funziona bene, ma ovviamente ciò che accade è che Nhibernate prima interroga il database per restituire tutte le righe, quindi LinQ filtra i risultati per restituire solo quelli il cui nome è "Dave".

Ho guardato su Internet, ma non ho trovato come implementarlo, anche ho trovato molte cose che sembrano essere obsolete, ad esempio, ho visto spesso le chiamate al metodo NH session.linq (), i Ho guardato dappertutto le mie DLL, questo metodo non si trova da nessuna parte ...

Se qualcuno potesse indicarmi la giusta direzione, forse con un piccolo esempio o qualcosa del genere, sarei molto grato.

Ti ho ringraziato molto!

È stato utile?

Soluzione

È abbastanza semplice:

Uso session.Query<T>():

public virtual IQueryable<T> All()
{
    return Session.Query<T>();
}

Query<T> è un metodo di estensione che vive nello spazio dei nomi NHibernate.Linq.

session.Linq non è più supportato. Era il provider LINQ per NHibernate prima della versione 3 ed è stato sostituito da Query<T>.

Altri suggerimenti

Potresti voler vedere usando il modello di specifica con il tuo repository. C'è un esempio di implementazione con nhibernate qui Dal libro di cucina Nhibernate 3.0, che vale la pena ottenere un'eccellente risorsa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top