【问题标题】:NHibernate QueryOver association does not contain itemNHibernate QueryOver 关联不包含项目
【发布时间】:2011-09-10 07:09:05
【问题描述】:

有人可以帮我将 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.IEnumerable1[TSource], System.Func2[TSource,System.Boolean]

【问题讨论】:

    标签: nhibernate queryover


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我是这样做到的:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-21
          相关资源
          最近更新 更多