Domanda

qualcuno potrebbe aiutarmi a tradurre l'espressione Linq in queryover nhibernate

from m in messages
where !m.Recipients.Any(rcpt => rcpt.IsDeleted && rcpt.User = user)

Ho provato questo

var qry = Session.QueryOver<UserMessage>();
qry.Where(m => m.Recipients.Any(r => !r.IsDeleted && r.User == user));

ma ho

System.Exception: Metodo non riconosciuto Chiama: System.linq.Inumerable: booleano qualsiasi [tsource] (System.Collections.generic.ienumerable1[TSource], System.Func2 [Tsource, System.Boolean

È stato utile?

Soluzione 2

Ci sono riuscito in questo modo:

UserMessage messageAlias = null;

var qry = Session.QueryOver<UserMessage>(() => messageAlias);

UserMessageRecipient recipientAlias = null;

var deletedbyUser = QueryOver.Of(() => recipientAlias)
  .Select(x => x.Id)
  .Where( () => recipientAlias.Message.Id == messageAlias.Id
    && (recipientAlias.Recipient == query.User && recipientAlias.IsDeleted))
                .DetachedCriteria;
qry.Where(Subqueries.NotExists(deletedbyUser));

Altri suggerimenti

!m.Recipients.Any(...) si traduce in una sottochyry "non esiste". Avrai bisogno di un paio di alias per correlare la sottocarma con la query principale e la sottocarma dovrà avere una proiezione per rendere felice Nhibernate.

Prova qualcosa di simile:

UserMessage messageAlias = null;
UserMessage recipientMessageAlias = null;

var subquery = QueryOver.Of<MessageRecipient>()
    .JoinAlias(x => x.Message, () => recipientMessageAlias)
    .Where(x => x.IsDeleted == true) // your criteria
    .Where(x => x.User.Id == userId)
    .Where(() => recipientMessageAlias.Id == messageAlias.Id) // correlated subquery
    .Select(x => x.Id); // projection

var query = session.QueryOver(() => messageAlias)
    .Where(Subqueries.WhereNotExists(subquery));

return query.List();

Prova a utilizzare la versione LINQ con session.query <> invece di queryover

var qry = Session.Query<UserMessage>();
qry.Where(m => m.Recipients.Any(r => !r.IsDeleted && r.User == user));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top