并集查询问题 返回

SqlSugar 处理完成
22 186
         var nonpackage = db.Sugardb.Queryable<SysProjectDTO>()
                .LeftJoin<SysFrequencyDTO>((pd, fd) => pd.frequency_id == fd.id)
                .LeftJoin<SysUnitDTO>((pd, fd, ud) => pd.unit == ud.id)
                .Where((pd, fd, ud) => pd.status == 1)
                .Where((pd, fd, ud) => pd.data_type == 0)//非套餐
                .Select((pd, fd, ud) => new SysProjectDTO()
                {
                    projectPrices = SqlFunc.Subqueryable<SysProjectPriceDTO>()
                        .Where(it => it.status == 1 && it.project_id == pd.id && it.organ_id == organ_id)
                        .ToList(it => new ProjectSonModel()
                        {
                            id = it.id,
                            organ_id = it.organ_id,
                            parent_id = it.project_id,
                            num = 1,
                            unit_price = it.price_cost,
                            discount = it.price_sell
                        })
                }, true);
            var package = db.Sugardb.Queryable<SysProjectDTO>()
                .LeftJoin<SysFrequencyDTO>((pd, fd) => pd.frequency_id == fd.id)
                .LeftJoin<SysUnitDTO>((pd, fd, ud) => pd.unit == ud.id)
                .Where((pd, fd, ud) => pd.status == 1)
                .Where((pd, fd, ud) => pd.data_type == 1)//套餐
                .Select((pd, fd, ud) => new SysProjectDTO()
                {
                    projectPrices = SqlFunc.Subqueryable<SysProjectCombinationDTO>()
                        .Where(it => it.status == 1 && it.parent_id == pd.id && it.organ_id == organ_id)
                        .ToList(it => new ProjectSonModel()
                        {
                            id = it.id,
                            organ_id = it.organ_id,
                            parent_id = it.project_id,
                            num = it.num,
                            unit_price = it.unit_price,
                            discount = it.discount
                        })
                }, true);
            var a1 = nonpackage.ToList();
            var a2 = package.ToList();
            var list = db.Sugardb.UnionAll(nonpackage, package)
                .ToList();


问题:

projectPrices是List<ProjectSonModel>,然后nonpackage和package单独看,各自的projectPrices都是有数据的,然后UnionAll之后,projectPrices就变成null了。是哪里少了东西吗。




热忱回答22

  •  var a1 = nonpackage.ToList();
      var a2 = package.ToList();

    上面都删掉不能写在unionall前面 ,多个使用要用.clone()

    0 回复
  • 找到问题通过AOP监控SQL

    0 回复
  • @fate sta:这两个只是我临时加进去看数据的,去掉之后,还是没有的。

    ToSqlString()的sql里面没有和子查询有关的。 

    0 回复
  • @fate sta

    var project = db.Sugardb.Queryable<SysProjectDTO>()

                    .LeftJoin<SysFrequencyDTO>((pd, fd) => pd.frequency_id == fd.id)

                    .LeftJoin<SysUnitDTO>((pd, fd, ud) => pd.unit == ud.id)

                    .Where((pd, fd, ud) => pd.status == 1);

                var nonpackage = project

                    .Clone()

                    .Where((pd, fd, ud) => pd.data_type == 0)//非套餐

                    .Select((pd, fd, ud) => new SysProjectDTO()

                    {

                        projectPrices = SqlFunc.Subqueryable<SysProjectPriceDTO>()

                            .Where(it => it.status == 1 && it.project_id == pd.id && it.organ_id == organ_id)

                            .ToList(it => new ProjectSonModel()

                            {

                                id = it.id,

                                organ_id = it.organ_id,

                                parent_id = it.project_id,

                                num = 1,

                                unit_price = it.price_cost,

                                discount = it.price_sell

                            }, true)

                    }, true);

                var package = project

                    .Clone()

                    .Where((pd, fd, ud) => pd.data_type == 1)//套餐

                    .Select((pd, fd, ud) => new SysProjectDTO()

                    {

                        projectPrices = SqlFunc.Subqueryable<SysProjectCombinationDTO>()

                            .Where(it => it.status == 1 && it.parent_id == pd.id && it.organ_id == organ_id)

                            .ToList(it => new ProjectSonModel()

                            {

                                id = it.id,

                                organ_id = it.organ_id,

                                parent_id = it.project_id,

                                num = it.num,

                                unit_price = it.unit_price,

                                discount = it.discount

                            }, true)

                    }, true);


                var list = db.Sugardb.UnionAll(nonpackage, package)

                    .ToList();

    这样使用Clone()?结果还是没有。。

    0 回复
  • @fate sta
    这个是demo demo.rar


    0 回复
  • @国王迷宫:删掉上面2个tolist就行了,如果共用一个queryable需要clone()

    0 回复
  • 你的DEMO有数据的,返回了4条

    0 回复
  • image.png

    0 回复
  • @fate sta

    数据是有4条的,但是并集查询之后,这4条数据里面的projectPrices 这个list变成null值了

    0 回复
  • @国王迷宫:你看上面的截图,LIST是有数据的

    0 回复
  • @fate sta

    Console.WriteLine(package.Clone().First().projectPrices.Count());

    Console.WriteLine(nonpackage.Clone().First().projectPrices.Count());

    var list = db.Sugardb.UnionAll(package, nonpackage).ToList();

    Console.WriteLine(list.First().projectPrices == null);

    1.png

    这样呢

    0 回复
  • 这个要要写到unionall后面

    0 回复
  • 写前面肯定拿不到

    0 回复
  •  unionall.Select 里面用subquery.tolist

    0 回复
  • @fate sta:唔,是指先把两个子表UnionAll起来,再用project表去子查询是吗

    0 回复
  • @国王迷宫:是的

    0 回复
  • @fate sta

    还是有疑问...
       var projectSon = db.Sugardb.UnionAll(nopackageSon, packageSon);
    这样是把两个子表UnionAll起来了,

         var list= project

                    .Clone()

                    .Select((pd, fd, ud) => new SysProjectDTO()

                    {

                        projectPrices = projectSon.Where(oo => oo.parent_id == pd.id).ToList()           (这个地方要怎么写,这里projectSon.Where应该是错误的)

                    });



    0 回复
  • db.Sugardb.UnionAll(nopackageSon, packageSon).Select(it=>new {

      ....

    }).ToList();

    0 回复
  • @fate sta

    这样只是两个子表在并集查,那查父表project表的时候,怎么用子查询把并集结果绑定到project实体类里的非数据库字段List<ProjectSonModel> projectPrices 上?

    0 回复
  • @国王迷宫:你先把unionall都有都查出来不要想着projectPrices, unionall可以理解为一个表对象,可以为一个表

    unionall之后在考虑 projectPrices 怎么用

    0 回复
  • 先保证unionall出来是一个完整的表

    0 回复
  • 解决了,感谢

    0 回复