NHibernate查询如何在未声明的关系上加入

NHibernate查询如何在未声明的关系上加入,nhibernate,join,queryover,Nhibernate,Join,Queryover,如何执行以下连接以返回具有给定公司id的公司访问权限的用户。 问题在于,使用用户对象时,UserAccess和用户之间没有明确的关系,他们只是在字符串属性Username上加入: User(Username, Name) UserAccess(Username, Company) Company(Id) Session.QueryOver<Company>() .Where(c => c.Id == companyId) .JoinQueryO

如何执行以下连接以返回具有给定公司id的公司访问权限的用户。 问题在于,使用用户对象时,UserAccess和用户之间没有明确的关系,他们只是在字符串属性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**
用户(用户名、名称)
UserAccess(用户名、公司)
公司(Id)
Session.QueryOver()
.其中(c=>c.Id==companyId)
.JoinQueryOver(u=>u.UserAccessList)
.JoinQueryOver(u=>**没有属性,只有一个字符串**

可以通过子查询完成

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();
var subquery=QueryOver.Of()
.其中(c=>c.Id==companyId)
.JoinQueryOver(u=>u.UserAccessList)
.Select(uca=>uca.UserName);
var users=session.QueryOver()
.WithSubquery.WhereProperty(u=>u.Name).In(子查询)
.List();

从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>();
var标准=\u会话
.创建标准(“订单”);
标准
.CreateEntityAlias(
“客户”,
限制.设备属性(“订单.客户id”,“客户id”),
JoinType.LeftOuterJoin,
类型(客户)。全名)
.AddOrder(新订单(“customer.\u lifetimeSpending”,升序:false));
返回条件。List();
也可以使用QueryOver(样本来源):

Cat=null;
Cat joinedCat=null;
var uniquelyNamedCats=sess.QueryOver(()=>cat)
.JoinEntityAlias(
()=>联合猫,
()=>cat.Name==joinedCat.Name&&cat.Id!=joinedCat.Id,
JoinType.LeftOuterJoin)
.Where(()=>joinedCat.Id==null)
.List();
另请参见
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();