如何在 NHibernate QueryOver 中找到匹配的数据对?

问题描述

我有两个列表。

AccountNumbers  ["account1","account2","account3"]
Descriptions [ "desc1","" ] (possible should be empty value)

我有两个数据库AccountAccountDescriptionHistory。表与 accountId 有关系。

账户表设计:- AccountId,AccountNumber,描述,

帐户描述历史记录:- AccountId、描述、validTo、validFrom

现在,我想设计一个 Nhibernet 查询,其中包含以下要求的查询

  1. Account 表应与 AccountDescriptionHistory 连接,左连接与 accountId 列连接。

  2. 帐号应从通过 accountnumbers 的列表中过滤掉。

  3. Description 应该从 descriptions 的传递列表中匹配,并且 如果传递参数 accountdescriptionhistory 是从 datetocheck 表中选择描述 大于和小于 validFromvalidTo 列的 accountdescriptionhistory 否则,从 account 表中选择。

  4. 考虑数据库列中的空值和小写值

我已尝试使用以下查询,但不知道如何从集合中进行过滤。

        public IEnumerable<Account> CheckForExistingAccounts(ISession session,Owner owner,IEnumerable<string> accountNumbers,IEnumerable<string> descriptions,bool isUpdating,DateTime? datetocheck = null)
    {
        Account accountAlias = null;
        AccountDescriptionHistory accountDescripAlias = null;


        var existingaccountsquery = session.queryover(() => accountalias).
                                joinentityalias(() => accountdescripalias,() => accountdescripalias.account.id == accountalias.id,jointype.leftouterjoin).
                                where(account => !account.isdeleted && account.owner.id == owner.id).
                                selectlist(list => list
                                        .select(() => accountalias.id).withalias(() => accountalias.id)
                                        .select(projections.conditional(expression.isnull(
                                                projections.property(accountalias.accountnumber)),projections.property(string.empty),projections.property(string.empty))).withalias(() => accountalias.accountnumber)
                                        .select(() => accountalias.changed).withalias(() => accountalias.changed)
                                        .select(() => accountalias.created).withalias(() => accountalias.created)
                                        .select(() => accountalias.sequencenumber).withalias(() => accountalias.sequencenumber)
                                        .select(() => accountalias.accounttype).withalias(() => accountalias.accounttype)
                                        .select(() => accountalias.parentaccount).withalias(() => accountalias.parentaccount)
                                        .select(() => accountalias.coreaccountid).withalias(() => accountalias.coreaccountid)
                                        .select(() => accountalias.sourceid).withalias(() => accountalias.sourceid)
                                        .select(() => accountalias.description).withalias(() => accountalias.description)
                                ).transformusing(new deeptransformer<account>()).future<account>();



        var data = existingaccountsquery.List();

        return data;
    }

解决方法

我针对上述描述性问题或问题开发了查询。如果将来对其他开发者有帮助,我会在这里发帖。

`var existingAccountsQuery = session.QueryOver(() => accountAlias)
        .JoinEntityAlias(() => accountDescripAlias,Restrictions.And
                    (
                        //And clause 1
                        Restrictions.EqProperty($"{nameof(accountAlias)}.{nameof(accountAlias.Id)}","accountDescripAlias.Account.Id"),//And clause 2
                        Restrictions.And(
                            Restrictions.Le(
                                Projections.SqlFunction("date",NHibernateUtil.Date,Projections.Property(
                                    $"{nameof(accountDescripAlias)}.{nameof(accountDescripAlias.ValidFrom)}")),dateToCheck),Restrictions.Ge(
                                Projections.SqlFunction("date",dateToCheck)
                            )
                    ),JoinType.LeftOuterJoin)
        .Where(() => !accountAlias.IsDeleted && accountAlias.Owner.Id == owner.Id)
        .Where(() => accountAlias.AccountNumber == null || accountAlias.AccountNumber.Lower().IsIn(accountNumbers.ToArray()))
        .Where(() =>
            (
                accountDescripAlias.AccountDescription != null &&
                accountDescripAlias.ValidFrom <= dateToCheck && accountDescripAlias.ValidTo >= dateToCheck &&
                accountDescripAlias.AccountDescription.Lower().IsIn(descriptions.ToArray())
            ) ||
            (
                accountDescripAlias.AccountDescription == null &&
                accountAlias.Description != null &&
                accountAlias.Description.Lower().IsIn(descriptions.ToArray())
            ) ||
            (
                accountDescripAlias.AccountDescription == null &&
                accountAlias.Description == null
            )
        );`