Ассоциация NHibernate QueryOver не содержит элемент - PullRequest
3 голосов
/ 10 сентября 2011

Может кто-нибудь помочь мне перевести выражение LINQ в Nhibernate QueryOver

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

Я пробовал это

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

но получил

System.Exception: нераспознанный вызов метода: System.Linq.Enumerable: Boolean Any [TSource] (System.Collections.Generic.IEnumerable 1[TSource], System.Func 2 [TSource, System.Boolean]

Ответы [ 3 ]

3 голосов
/ 11 сентября 2011

!m.Recipients.Any(...) переводится в подзапрос «не существует».Вам понадобится пара псевдонимов, чтобы сопоставить подзапрос с основным запросом, а подзапрос должен иметь проекцию, чтобы сделать NHibernate счастливым.

Попробуйте что-то вроде этого:*

2 голосов
/ 16 сентября 2011

Мне удалось это так:

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));
1 голос
/ 23 января 2012

Попробуйте использовать версию Linq с session.Query <> вместо QueryOver

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