UnionAll如何提高效率? 返回

SqlSugar 处理完成
6 545
该叫什么 Kane 发布于2024/6/11
悬赏:0 飞吻

我有几个不同结构的表

var tableA = db.Queryable<U8PurchaseInItem>().Select(e=>e.Code);

var tableB = db.Queryable<U8OtherInItem>().Select(e=>e.Code);

var tableC = db.Queryable<U8MateralInItem>().Select(e=>e.Code);

//如果ToList()后数据量可能有几万;

var codes = db.UnionAll(tableA ,tableB,tableC).Distinct().ToList();


 db.Queryable<U8Inventory>()

               .LeftJoin<U8InvClass>((e, c) => e.ClassCode == c.ClassCode)

               .LeftJoin<U8Unit>((e, c, u) => e.UnitCode == u.UnitCode)

               .LeftJoin<U8InvExtraDefine>((e, c, u, d) => e.InvCode == d.InvCode)

               .Where((e, c, u,d) => codes.Contains(e.InvCode)).OrderBy(e => e.StartDate)

               .Select((e, c, u, d) => new Inventory {  }, true).ToList();


如果codes  不进行ToList()操作,使用

.Where((e, c, u,d) => codes.Where(x=>x==e.InvCode).Any()).OrderBy(e => e.StartDate)

,则会报错,提示

中文提示 : 子查请使用SqlFunc.Subquery<Order>()来实现,不能用Queryable对象

English Message : Sublookup is implemented using SqlFunc.Subquery<Order>(); Queryable objects cannot be used


有没有办法,不用 codes ToList(),也可以放到下面的子查询中去?

热忱回答6

  • fate sta fate sta VIP0
    2024/6/11

    var tableC = db.Queryable<U8MateralInItem>().Select(e=>new  {e.Code});


    全部加上new {} 就能unionall了

    0 回复
  • fate sta fate sta VIP0
    2024/6/11

    var sql=unionall.ToSqlString()

    然后

    SqlFunc.Subquery<Order>().As(sql)

    这样试试

    0 回复
  • Kane Kane VIP0
    2024/6/11

    @fate sta:还是不行。


    //定义一个临时类

    public class Invs

    {

        public string Code {get;set;}

    }


    var tableA = db.Queryable<U8PurchaseInItem>().Select(e=>new Invs{ Code = e.Code});

    var tableB = db.Queryable<U8OtherInItem>().Select(e=>new Invs{ Code = e.Code});

    var tableC = db.Queryable<U8MateralInItem>().Select(e=>new Invs{ Code = e.Code});

    var sql = db.UnionAll(tableA ,tableB,tableC).Distinct().ToSqlString();


     db.Queryable<U8Inventory>()

                   .LeftJoin<U8InvClass>((e, c) => e.ClassCode == c.ClassCode)

                   .LeftJoin<U8Unit>((e, c, u) => e.UnitCode == u.UnitCode)

                   .LeftJoin<U8InvExtraDefine>((e, c, u, d) => e.InvCode == d.InvCode)

                   .Where((e, c, u,d) =>  SqlFunc.Subqueryable<Invs>().AS(sql ).Where(x=>x.InvCode==e.InvCode).Any()).OrderBy(e => e.StartDate)

                   .Select((e, c, u, d) => new Inventory {  }, true).ToList();

    这样会报 

    关键字 'SELECT' 附近有语法错误。

    ')' 附近有语法错误。


    如果改成

    .Where((e, c, u, d) =>  SqlFunc.Subqueryable<Invs>().AS(" ").Where(sql).Where(x=>x.InvCode==e.InvCode).Any()).OrderBy(e => e.StartDate)

    这样会报

    关键字 'WHERE' 附近有语法错误。

    ')' 附近有语法错误。



    0 回复
  • fate sta fate sta VIP0
    2024/6/11

    var sql="(“+sql+”) tt"

    0 回复
  • fate sta fate sta VIP0
    2024/6/11

    AOP看一下SQL应该很接近了可能要小调一下

    0 回复
  • Kane Kane VIP0
    2024/6/11

    @fate sta


    var tableA = db.Queryable<U8PurchaseInItem>().Select(e=>e.Code);

    var tableB = db.Queryable<U8OtherInItem>().Select(e=>e.Code);

    var tableC = db.Queryable<U8MateralInItem>().Select(e=>e.Code);

    var codes = db.UnionAll(tableA ,tableB,tableC).Distinct();


    var sql = $"( {codes.ToSqlString() } ) x";


    var result = await db.Queryable<U8Inventory>()

      .LeftJoin<U8InvClass>((e, c) => e.ClassCode == c.ClassCode)

      .LeftJoin<U8Unit>((e, c, u) => e.UnitCode == u.UnitCode)

      .LeftJoin<U8InvExtraDefine>((e, c, u, d) => e.InvCode == d.InvCode)

      .Where((e, c, u, d) =>  SqlFunc.Subqueryable<object>().AS(sql).Where("x.Code= e.InvCode").Any()).OrderBy(e => e.StartDate)

      .Select((e, c, u, d) => new Inventory { ClassCode = c.ClassCode, ClassName = c.ClassName, CreateUserName = e.CreateUser }, true)

      .ToListAsync();


    这样成功了,感谢作者的帮助👍

    0 回复