NHibernate - 如何使用限制在连接表中QueryOver

时间:2015-01-20 05:10:16

标签: c# join nhibernate fluent-nhibernate queryover

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

我有两个具有多对多关系的表(客户端和技术),因此我创建了一个名为ClientTechnology的联结表。

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

在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

My 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");
    }

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

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

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

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

1 个答案:

答案 0 :(得分:1)

在您的情况下,唯一的问题是,您没有在.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或
    • 属于客户
  3. 如何创建子查询,您可以在此处看到:

    以OR

    为例