【问题标题】:NHibernate - How to QueryOver in joined table with restrictionsNHibernate - 如何在有限制的连接表中查询
【发布时间】:2015-03-18 06:11:10
【问题描述】:

我遇到了一个 SQL 查询(使用 NHibernate 4)。

我有 2 个具有多对多关系的表(Client 和 Technology),因此我创建了一个名为 ClientTechnology 的联结表。

我正在尝试检索所有可用的技术(非自定义)以及所有可用的技术(自定义)并属于给定的客户。

在 SQL 中是这样的语句:

declare @clientId int = 1

        select * from
        [dbo].[Technology] t
        where t.IsCustom = 0
        union
        select t.* from
        [dbo].[Technology] t
        join [dbo].[ClientTechnology] ct
        on ct.TechnologyId = t.Id
        where t.IsCustom = 1 and ct.ClientId = @clientId

我的 Fluent Mapping for Client 表是:

public ClientMap()
    {
        Id(x => x.Id);
        Map(x => x.Name).Not.Nullable();
    }

对于技术表是:

public TechnologyMap()
    {
        Id(x => x.Id);
        Map(x => x.Name).Not.Nullable();
        Map(x => x.IsCustom).Not.Nullable();

        HasMany(x => x.ClientTechnologies)
            .Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)
            .Table("ClientTechnology")
            .KeyColumn("TechnologyId");
    }

最后是联结表 ClientTechnology:

public ClientTechnologyMap()
    {
        Id(x => x.Id);
        Map(x => x.Alias).Not.Nullable();
        Map(x => x.IsDeleted).Not.Nullable();

        References<Client>(x => x.Client, "ClientId");
        References<Technology>(x => x.Technology, "TechnologyId");
    }

我愿意接受不同的选择来实现这一目标。 假设我有一个可用的 Client 对象(ClientId) 我可以首先检索符合 IsCustom = false 要求的技术列表 然后检索符合要求的技术列表 IsCustom = true AND "提供的客户是此自定义技术的所有者"

在必须返回 Technology 可枚举的方法 public IEnumerable&lt;Technology&gt; GetTechnologies(Client client) 中(给定一个客户端实例)

我尝试了以下方法来检索 globalTechnologies:

var globalTechnologies = _session.QueryOver<Technology>()
            .WhereNot(x => x.IsDeleted)
            .WhereNot(x => x.IsCustom)
            .List();

对于拥有者为客户的 customTechnologies,以下内容:

Technology technology = null;
        ClientTechnology clientTechnology = null;
        var customTechnologies = _session.QueryOver<Technology>(() => technology)
            .JoinAlias(() => technology.ClientTechnologies, () => clientTechnology)
            .WhereNot(x => x.IsDeleted)
            .Where(x => x.IsCustom)
            .Where(clientTechnology.Client == client) //this doesn't compile
            .List();

我不知道如何访问联结表(已连接)以应用限制

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: c# join nhibernate fluent-nhibernate queryover


    【解决方案1】:

    在您的情况下,唯一的问题是,您没有在 .Where() 内提供表达式,所以这应该可以完成工作:

    // instead of this
    // .Where(clientTechnology.Client == client) //this doesn't compile
    // use this
    .Where(() => clientTechnology.Client == client)
    

    但我会走得更远。我们应该能够创建子查询,

    1. 只会返回属于客户的Techonology.Id
    2. 然后我们也可以使用 OR 并有一个查询可以选择以下人员:
      • 不是自定义或
      • 属于客户

    如何创建子查询你可以在这里看到:

    还有 OR 的例子

    【讨论】:

    • 太棒了!那是我缺少的一块。效果很好。谢谢你。非常完整的答案。我会调查你的建议,因为它似乎更有效率。
    猜你喜欢
    • 2011-08-23
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多