sql server 关联查询,通过with指定索引,生成的sql中,所有表后面跟着的 with 内容都相同 返回

SqlSugar 沟通中
3 700

因为一些历史遗留问题,数据库的索引设计并不合理。现在数据量较大,执行计划选择的索引不是最优,所以考虑使用指定索引来提升查询性能。发现了此问题。

C#代码:
Context.Queryable<Table_A>().With("WITH(INDEX(ix_a))")

  .LeftJoin<Table_B>((a,b) => a.Pid == b.Id)
.....;

生成的sql是这样:
select .....
from Table_A WITH(INDEX(ix_a))

    left join Table_B b WITH(INDEX(ix_a))

......


代码改成

Context.Queryable<Table_A>().With("WITH(INDEX(ix_a))")

  .LeftJoin<Table_B>((a,b) => a.Pid == b.Id).With("WITH(NOLOCK)")
.....;


生成的sql是这样:

select .....
from Table_A a WITH(NOLOCK)

    left join Table_B b WITH(NOLOCK)

......


热忱回答3

  •  var q11 = db.Queryable<Order>().With("WITH(INDEX(ix_a))").Where(it => it.Id>1);
     var q22 = db.Queryable<Order>().Where(it => it.Id > 2);
     var q33 = db.Queryable<Order>().Where(it => it.Id > 3);
      
      var list= q11.LeftJoin(q22, (x, y) => x.Id == y.Id)
             .LeftJoin(q33, (x, y, z) => x.Id == z.Id)
             .ToList();


    0 回复
  • 可以改用嵌套查询方式实现。这样就不会出现你说的问题

    0 回复
  • @fate sta:感谢回复,嵌套查询相当于把每个表的查询包了一层。
    试了一下,确实可行。就是代码写出来不是很简洁,生成的sql嵌套的层数也有点多。

    0 回复