NHibernate查询版本关联不包含项

NHibernate查询版本关联不包含项,nhibernate,queryover,Nhibernate,Queryover,有人能帮我把LINQ表达式翻译成Nhibernate QueryOver吗 from m in messages where !m.Recipients.Any(rcpt => rcpt.IsDeleted && rcpt.User = user) var qry = Session.Query<UserMessage>(); qry.Where(m => m.Recipients.Any(r => !r.IsDeleted &&

有人能帮我把LINQ表达式翻译成Nhibernate QueryOver吗

from m in messages
where !m.Recipients.Any(rcpt => rcpt.IsDeleted && rcpt.User = user)
var qry = Session.Query<UserMessage>();
qry.Where(m => m.Recipients.Any(r => !r.IsDeleted && r.User == user));
我试过这个

var qry = Session.QueryOver<UserMessage>();
qry.Where(m => m.Recipients.Any(r => !r.IsDeleted && r.User == user));
var qry=Session.QueryOver();
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]

!m.Recipients.Any(…)
转换为“不存在”子查询。您需要几个别名来关联子查询与主查询,并且子查询需要有一个投影以使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();
usermessagealias=null;
UserMessageRecipientMessageAlias=null;
var subquery=QueryOver.Of()
.JoinAlias(x=>x.Message,()=>recipientMessageAlias)
.Where(x=>x.IsDeleted==true)//您的条件
.Where(x=>x.User.Id==userId)
.Where(()=>recipientMessageAlias.Id==messageAlias.Id)//相关子查询
.选择(x=>x.Id);//投影
var query=session.QueryOver(()=>messageAlias)
.Where(子查询.WhereNotExists(子查询));
返回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));
usermessagealias=null;
var qry=Session.QueryOver(()=>messageAlias);
UserMessageRecipientRecipientAlias=null;
var deletedbyUser=QueryOver.Of(()=>recipientAlias)
.选择(x=>x.Id)
.Where(()=>recipientAlias.Message.Id==messageAlias.Id
&&(recipientAlias.Recipient==query.User&&recipientAlias.IsDeleted))
.分离标准;
qry.Where(subquerys.NotExists(deletedbyUser));

尝试将Linq版本与session.Query一起使用,而不是QueryOver

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