【问题标题】:Restriction on collection with disjunction using NHibernate QueryOver使用 NHibernate QueryOver 对带有析取的收集进行限制
【发布时间】:2012-03-10 09:12:46
【问题描述】:

您好所有 NHibernate 大师!

鉴于这两个类:

public class User {
    long Id;
    string Name;
}

public class Project {
    long Id;
    User Owner;
    IList<User> Managers;
    ...
}

我想使用 QueryOver(不使用标准“魔术字符串”别名)进行查询,以获取所有将 user1 作为所有者 OR 作为其中之一的项目经理。

我知道如何分开:

  • 获取拥有 user1 作为 Owner 的项目:session.QueryOverProject>>().Where(p=>p.Owner == user1)
  • 成为经理:session.QueryOver().JoinAlias(p=>p.Managers, ()=>manager).Where(()=>manager == user1)

但是我不知道怎么写析取

如果有人有想法,对我有很大帮助。

提前致谢,

克里斯

【问题讨论】:

    标签: nhibernate queryover


    【解决方案1】:

    类似:-

    User manager = null;
    
    var query = session
        .QueryOver<Project>()
        .JoinAlias(j => j.Managers, () => manager)
        .Where(w => manager.Name == user1 || w.Owner == user1)
        .List<Project>();
    

    编辑将过滤器从 Name 更改为 Id(正如 OP 指出的那样):-

    .Where(w=>manager.Id == user1.Id || w.Owner.Id == user1.Id)
    

    edit2 将内部更改为左侧使用

    .JoinAlias(j => j.Managers, () => manager).left
    

    【讨论】:

    • 谢谢,事实上我们必须对对象的 ID 做相等,而不是对象 .Where(w=>manager.Id == user1.Id || w.Owner.Id == user1 .Id) 但是,这并没有给出预期的结果,因为它在 Project 和 User 之间进行了内部连接,因此,没有得到具有 user1 作为所有者但还没有任何经理的项目:(
    • 对不起,我不是 100% 确定您想要过滤什么,并且您没有提到您想要左连接...
    • 别抱歉,你不知道 :) .Left.JoinAlias(...) 成功了。非常感谢里波!
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多