nhibernate5.5.0 JoinEntityAlias 多个 ProjectionList 结果不起作用

问题描述 投票:0回答:1
        public IList<RoomEcologyDto> GetNonassetJoinPersonData(ExpressionCondition<UVNonAssetAll> nonassetCondition)
        {
            var lambda_contract_effect = bizUTRenterContract.lambda_effect_condition();
            var lambda_contract = lambda_contract_effect.ConditionExpression;
            var lambda_nonasset = nonassetCondition.ConditionExpression;
            UVNonAssetAll a = null;
            UTRenterContract b = null;
            UTRenterApplyIn c = null;
            var sqlQuery = dbAccess.Session.QueryOver(() => a).Where(lambda_nonasset)
                .JoinEntityAlias(() => b, Restrictions.And(Restrictions.Where(() => a.keyId == b.NonAssetID), Restrictions.Where(lambda_contract)), JoinType.LeftOuterJoin)
                .JoinEntityAlias(() => c, Restrictions.Where(() => c.ID == b.ApplyID), JoinType.LeftOuterJoin);
            ;
            sqlQuery = sqlQuery.Select(
                Projections.ProjectionList()
                .Add(Projections.RootEntity())
                .Add(Projections.Property(nameof(b)+"."+nameof(UTRenterContract.ID)))//=> not error,sql right,but res=[{a:UVNonAssetAll}]
                .Add(Projections.Select<UTRenterContract>(x => x.ID), nameof(RoomEcologyDto.renterContractId)) // sqlQuery.List<Hashtable>().error::“could not resolve property: ID of: HYGZFSys.Entity.UVNonAssetAll”
                .Add(Projections.Property<UTRenterContract>(x => x.ID), nameof(RoomEcologyDto.renterContractId))// sqlQuery.List<Hashtable>().error could not resolve property: ID of: HYGZFSys.Entity.UVNonAssetAll”
                )
                ;
            sqlQuery = sqlQuery.TransformUsing(Transformers.AliasToEntityMap);
            var res = sqlQuery.List<Hashtable>();
            return new List<RoomEcologyDto>();
        }
  1. 字符串属性有效,但 hashtale 结果仍然是 [{a:UVNonAssetAll}]
  2. 如何拉姆达?
  3. 转换为 RoomEcologyDto? ,当我使用变压器时=> 无法在类“System.RuntimeType
  4. ”中找到属性“a”的设置器
nhibernate queryover nhibernate-projections
1个回答
0
投票

结束了

必须对齐

        public IList<RoomEcologyDto> GetNonassetJoinPersonData(ExpressionCondition<UVNonAssetAll> nonassetCondition)
    {
        var lambda_contract_effect = bizUTRenterContract.lambda_effect_condition();
        var lambda_contract = lambda_contract_effect.ConditionExpression;
        var lambda_nonasset = nonassetCondition.ConditionExpression;
        UVNonAssetAll a = null;
        UTRenterContract b = null;
        UTRenterApplyIn c = null;
        var sqlQuery = dbAccess.Session.QueryOver(() => a).Where(lambda_nonasset)
            .JoinEntityAlias(() => b, Restrictions.And(Restrictions.Where(() => a.keyId == b.NonAssetID), Restrictions.Where(lambda_contract)), JoinType.LeftOuterJoin)
            .JoinEntityAlias(() => c, Restrictions.Where(() => c.ID == b.ApplyID), JoinType.LeftOuterJoin);
        ;
        var columns = Projections.ProjectionList();
        columns.AddProjectColumnByPropertyFromClass<UVNonAssetAll>(nameof(a));
        columns.Add(Projections.Property(nameof(b) + "." + nameof(UTRenterContract.ID)).As(nameof(RoomEcologyDto.renterContractId)));
        columns.Add(Projections.Property(nameof(b) + "." + nameof(UTRenterContract.ApplyID)).As(nameof(RoomEcologyDto.renterContractApplyId)));
        columns.Add(Projections.Property(nameof(b) + "." + nameof(UTRenterContract.NonAssetID)).As(nameof(RoomEcologyDto.renterContractNonassetId)));
        columns.Add(Projections.Property(nameof(c) + "." + nameof(UTRenterApplyIn.ID)).As(nameof(RoomEcologyDto.renterApplyInId)));
        columns.Add(Projections.Property(nameof(c) + "." + nameof(UTRenterApplyIn.Name)).As(nameof(RoomEcologyDto.renterApplyInName)));
        columns.Add(Projections.Property(nameof(c) + "." + nameof(UTRenterApplyIn.ID)).As(nameof(RoomEcologyDto.renterContractId)));
        sqlQuery = sqlQuery.Select(columns);
        sqlQuery = sqlQuery.TransformUsing(Transformers.AliasToBean<RoomEcologyDto>());
        var res = sqlQuery.List<RoomEcologyDto>();
        return res;
    }

    public static ProjectionList AddProjectColumnByPropertyFromClass<T>(this ProjectionList projection, string alignPrefix = null)
    {
        var properties = typeof(T).GetProperties();
        var propertyNameList = properties.Select(x => x.Name).ToList();
        foreach (var propertyName in propertyNameList)
        {
            string alignName = alignPrefix;
            if (!string.IsNullOrEmpty(alignPrefix))
            {
                alignName = alignPrefix + "." + propertyName;
            }
            projection.Add(Projections.Property(alignName), propertyName);
        }
        return projection;
    }
© www.soinside.com 2019 - 2024. All rights reserved.