繁体   English   中英

NHibernate-如何在有限制的联接表中进行QueryOver

[英]NHibernate - How to QueryOver in joined table with restrictions

我陷入了SQL查询(使用NHibernate 4)。

我有2个具有多对多关系的表(客户和技术),所以我创建了一个称为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

我的客户端流利表是:

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的技术列表,并且“提供的客户端是此所有者定制技术”

在必须返回技术的可枚举的public IEnumerable<Technology> GetTechnologies(Client 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();

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

任何帮助将非常感激。 谢谢。

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

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

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

  1. 将仅返回属于客户端的此类Techonology.Id
  2. 然后,我们也可以使用OR并具有一个查询,该查询可以选择以下对象:
    • 不是IsCustom或
    • 确实属于客户

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

和OR的例子

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM