NHibernate查询版本关联不包含项
有人能帮我把LINQ表达式翻译成Nhibernate QueryOver吗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 &&
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.IEnumerable1[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));