NHibernate QueryOver关联不包含item



谁能帮我把LINQ表达式翻译成Nhibernate QueryOver

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

I tried this

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

但得到

系统。异常:未识别的方法调用:System.Linq。可列举的:任何[TSource] (System.Collections.Generic布尔。IEnumerable 1[TSource], System.Func 2[TSource,System.]布尔]

!m.Recipients.Any(...)转换为"not exists"子查询。你需要几个别名来将子查询与主查询关联起来,并且子查询需要有一个投影来让NHibernate高兴。

试试这样写:

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();

我是这样做的:

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));

尝试使用带有session.Query<>而不是QueryOver的Linq版本

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

最新更新