如何查询列表中的复合ID密钥

时间:2019-05-10 16:36:36

标签: c# nhibernate

如何在多个IN子句SQL中查询复合键字段?

我的子公司是字符串和公司的组合

public class Company
{
     public virtual String Id { get; set; }
}

public class Subsidiary
{
     public virtual String Id { get; set; }
     public virtual Company Company { get; set; }
}

public class Disponibility
{
     public virtual String IdCompany { get; set; }
     public virtual String IdSubsidiary { get; set; }
}

目前停留在此

var subsidiarys = session.Query<Subsidiary>().ToList();
var result = session.Query<Disponibility>().Where(x => subsidiarys.Contains(???) ).ToList();

生成的查询必须是

SELECT * FROM VW_DISPONIBILITY D
WHERE (D.COMPANY, D.SUBSIDIARY) IN (SELECT S.COMPANY, S.SUBSIDIARY FROM SUBSIDIARY S);

1 个答案:

答案 0 :(得分:0)

并非所有数据库都支持oracle多个IN子句,因此唯一的方法是将多个或连接起来。

var disjunctions = Restrictions.Disjunction();
foreach (var sub in subsidiarys)
{
    disjunctions.Add(Restrictions.Where<Disponibility>(x => x.IdCompany == sub.Company.Id && x.IdSubsidiary == sub.Id));
}

var result = session.QueryOver<Disponibility>()
                    .Where(disjunctions)
                    .List<Disponibility>();

生成的SQL

SELECT
    ...
FROM
    VW_DISPONIBILITY this_ 
WHERE
    (
        (
            this_.COMPANY = :p0 
            and this_.SUBSIDIARY = :p1
        ) 
        or (
            this_.COMPANY = :p2 
            and this_.SUBSIDIARY = :p3
        )
        ...
    );