NHibernate 投影元素集合

发布于 2024-12-05 19:13:38 字数 1169 浏览 8 评论 0原文

我想选择给定经理的所有未完成的请求。一个经理可以管理多个团队。

我根据权限编写应用各种限制的查询,并更改查询以提供行计数、存在检查、子查询等。

该组合使用 QueryOver,但使用 ICriteria 也可以接受。

给出以下课程;

class Team {
    public virtual int Manager { get; set; }
    public virtual ISet<int> Members { get; set; }
}

class Request {
    public virtual int Owner { get; set; }
    public virtual bool IsOutstanding { get; set; }
}

class static SomeRestrictions {
    public static void TeamsForManager<TRoot> (this IQueryOver<TRoot, Team> query, int managerId) {
        // In reality this is a little more complex
        query.Where (x => x.Manager == managerId);
    }
}

这是我正在尝试的当前查询(不起作用)。

var users = QueryOver.Of<Team> ();
users.TeamsForManager (5)
users.Select (/* not sure */);

var requests = session.QueryOver<Request> ()
    .Where (x => x.IsOutstanding)
    .WithSubquery.WhereProperty (x => x.Owner).In (users);

选择用户的 HQL 是:

"SELECT m FROM Team t JOIN t.Members m WHERE <TeamsForManager restrictions>"

但我不想使用 HQL,因为我无法将其与基于权限的其他限制组合起来。我也无法将它与其他查询组合起来以将其转换为行计数/存在检查等。

I want to select all requests that are outstanding for a given manager. A manager can have multiple teams.

I compose the queries applying various restrictions based upon permissions, and alter the queries to provide row counts, existence checks, sub queries, etc.

The composition makes use of QueryOver, though using ICriteria instead would also be acceptable.

Given the following classes;

class Team {
    public virtual int Manager { get; set; }
    public virtual ISet<int> Members { get; set; }
}

class Request {
    public virtual int Owner { get; set; }
    public virtual bool IsOutstanding { get; set; }
}

class static SomeRestrictions {
    public static void TeamsForManager<TRoot> (this IQueryOver<TRoot, Team> query, int managerId) {
        // In reality this is a little more complex
        query.Where (x => x.Manager == managerId);
    }
}

This is the current query that I'm trying (which doesn't work).

var users = QueryOver.Of<Team> ();
users.TeamsForManager (5)
users.Select (/* not sure */);

var requests = session.QueryOver<Request> ()
    .Where (x => x.IsOutstanding)
    .WithSubquery.WhereProperty (x => x.Owner).In (users);

The HQL to select the users would be:

"SELECT m FROM Team t JOIN t.Members m WHERE <TeamsForManager restrictions>"

But I don't want to use HQL because I can't then compose it with other restrictions based upon permissions. I also wouldn't be able to compose it with other queries to turn it into row counts/existence checks, etc.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

画中仙 2024-12-12 19:13:38

我看到你改变了模型,但这本来就是这样

var users = QueryOver.Of<Team> ();
users.TeamsForManager (5);
users.JoinAlias(t => t.Members, () => membervalue).Select(() => membervalue);

i saw you changed the model but this would have been the way

var users = QueryOver.Of<Team> ();
users.TeamsForManager (5);
users.JoinAlias(t => t.Members, () => membervalue).Select(() => membervalue);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文