NHibernate - Come scrivere questa query: SELECT genitori e trovare figlio per ogni genitore che corrisponde a una condizione di

StackOverflow https://stackoverflow.com/questions/3718103

Domanda

OK, in primo luogo il mio semplice modello di dominio è di 2 classi con una relazione uno-a-molti, un semplice genitore -> rapporto bambino. A 'Tweet' ha una o più 'votazioni', ma ogni votazione appartiene a un solo tweet, ecc.

public class Tweet
{
    public virtual long Id { get; set; }
    public virtual string Username { get; set; }
    public virtual string Message { get; set; }

    public virtual ISet<Vote> Votes { get; set; }
}

public class Vote
{
    public virtual long Id { get; set; }
    public virtual long TwitterUserId { get; set; }
    public virtual DateTime VotedDate { get; set; }

    public virtual Tweet Tweet { get; set; }
}

Sto cercando di scrivere una query in entrambi i HQL, ICriteria o NHibernate LINQ, che seleziona tutti i tweet, ma anche aggiungere due colonne che seleziona:

  • Un conteggio del numero di voti, e ...
  • Se un particolare utente ha votato per quel tweet, sulla base di una particolare TwitterUserId

Con le due colonne in più, io non sono in attesa di ottenere l'oggetto indietro Tweet dominio, e probabilmente necessario eseguire una query rapporto, che è ok. Ma sto lottando per capire come scrivere questa query.

so come scrivere questo come una stored procedure o utilizzando LINQ 2 SQL. Se aiuta esprimerò questo come una query LINQ to SQL.

long userId = 123;

var tweets = from t in dataContext.Tweets
             where t.Application == app
             orderby t.PostedDate desc
             select new TweetReport()
             {
                 Id = t.Id,
                 Username = t.Username,
                 Message = t.Message,
                 TotalVotes = t.Votes.Count(),
                 HasVoted = t.Votes.Any(v => v.TwitterUserId == userId)
             };

So che questo funzionerà in LINQ 2 SQL, e generare ragionevolmente efficiente T-SQL, ma non riesco a capire come scrivere questo in NHibernate.


Aggiornamento: Ho provato a fare funzionare la query LINQ sopra in NHibernate utilizzando il fornitore di NHibernate LINQ costruito per NHibernate v2 , ad esempio:

var tweets = from t in Session.Linq<Tweet>()
             where (snip)

Ma non ha funzionato. supporto LINQ in NHibernate 3.0 è migliorata? Sono un po 'riluttante ad usare la versione 3.0 perché è ancora alfa, ma se questo lavoro sarà, allora potrei dare un andare.


Aggiornamento 2: Grazie al suggerimento di Diego Mijelshon, ho aggiornato a NHibernate 3.0 alpha 2 e ha scritto la query in LINQ:

var tweets = from t in Session.Query<Tweet>()
             where t.App == app
             orderby t.PostedDate descending
             select t;

int totalRecords = tweets.Count();

var pagedTweets = (from t in tweets
                   select new TweetReport()
                   {
                       Id = t.Id,
                       TwitterId = t.TweetId,
                       Username = t.Username,
                       ProfileImageUrl = t.ImageUrl,
                       Message = t.Message,
                       DatePosted = t.PostedDate,
                       DeviceName = t.Device.Name,
                       DeviceUrl = t.Device.Url,
                       TotalVotes = t.Votes.Count(),
                       HasVoted = t.Votes.Any(v => v.TwitterUserId == userId)
                   })
                   .Skip(startIndex)
                   .Take(recordsPerPage)
                   .ToList();

return new PagedList<TweetReport>(pagedTweets,
    recordsPerPage, pageNumber, totalRecords);
È stato utile?

Soluzione

E 'esattamente lo stesso con NHibernate 3; basta sostituire dataContext.Tweets con session.Query<Tweet>.

In alternativa, è possibile creare una classe contesto che espone session.Query<Tweet> come una proprietà IQueryable<Tweet> Tweets, allora il codice sarebbe invariato al 100%.

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