NHibernate QueryOver如何加入非声明关系

时间:2011-08-16 10:07:07

标签: nhibernate join queryover

如何执行以下联接以返回有权访问公司ID的公司的用户。 问题是在UserAccess和User之间没有使用User对象的明确关系,他们只是加入字符串属性Username:

User(Username, Name)
UserAccess(Username, Company)
Company(Id)

Session.QueryOver<Company>()
        .Where(c => c.Id == companyId)
        .JoinQueryOver<UserCompanyAccess>(u => u.UserAccessList)
        .JoinQueryOver<User>(u => **Nope no property, just a string**

2 个答案:

答案 0 :(得分:11)

可以使用子查询

完成
var subquery = QueryOver.Of<Company>()
    .Where(c => c.Id == companyId)
    .JoinQueryOver<UserCompanyAccess>(u => u.UserAccessList)
    .Select(uca => uca.UserName);

var users = session.QueryOver<User>()
    .WithSubquery.WhereProperty(u => u.Name).In(subquery)
    .List();

答案 1 :(得分:0)

从5.1.0开始,可以使hibernate在未声明(未映射)关系上生成实际的sql连接。例如。所有订单均按客户支出排序:

var criteria = _session
    .CreateCriteria<Order>("order");

criteria
    .CreateEntityAlias(
        "customer",
        Restrictions.EqProperty("order.customerId", "customer._id"),
        JoinType.LeftOuterJoin,
        typeof(Customer).FullName)
    .AddOrder(new Order("customer._lifetimeSpending", ascending:false));

return criteria.List<Order>();

QueryOver也可以(来自NHibernate docs的示例):

Cat cat = null;
Cat joinedCat = null;

var uniquelyNamedCats = sess.QueryOver<Cat>(() => cat)
    .JoinEntityAlias(
        () => joinedCat,
        () => cat.Name == joinedCat.Name && cat.Id != joinedCat.Id,
        JoinType.LeftOuterJoin)
    .Where(() => joinedCat.Id == null)
    .List();