UnionAll如何提高效率? 返回

我有几个不同结构的表
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 VIP0
2024/6/11var tableC = db.Queryable<U8MateralInItem>().Select(e=>new {e.Code});
全部加上new {} 就能unionall了
0 回复 -
fate sta VIP0
2024/6/11var sql=unionall.ToSqlString()
然后
SqlFunc.Subquery<Order>().As(sql)
这样试试
0 回复 -
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 VIP0
2024/6/11var sql="(“+sql+”) tt"
0 回复 -
fate sta VIP0
2024/6/11AOP看一下SQL应该很接近了可能要小调一下
0 回复 -
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 回复