【.net core】【sqlsugar】使用嵌套查询解决联表查询时使用联表字段作为查询条件的问题

场景:有TableA,TableB两个表,需要联接两个表输出查询结果。以TableB为主表,链接TableA,查询时需要使用TableA中的字段作为查询条件。

加入有如下TableA,TableB表结构

//表A类
public class TableA{
    public int id {get;set;}
    public string name {get;set;}
    public string value {get;set;}
}
//表B类
public class TableB{
    public int id {get;set;}
    public int table_a_id{get;set;}
    public string name{get;set;}
    public string title{get;set;}
}

//表B视图类
public class ViewTableB:TableB{
    public string name_a {get;set;}
    public string value_a {get;set;}
}

查询代码 

string selectValue = "";//查询值
//Db为SqlSugarScopeProvider的实例
var queryView = Db.Queryable<TableB, TableA>((a, b) => new JoinQueryInfos(
        JoinType.Left, a.table_a_id == b.id
    ))
    .Select((a, b) => new ViewTableB()
    {
        id = a.id.SelectAll(),
        name_a = b.name,
        value_a = b.value
    });
//查询时使用CopyNew新建实例查询,避免实例冲突报错
var query = Db.CopyNew().Queryable(queryView).Select<ViewTableB>();

if (!string.IsNullOrEmpty(selectValue)) {
    query = query.Where(a => a.value_a.Contains(selectValue));
}

 代码等价于SQL

select * from (
select a.*,b.name as name_a,b.value as value_a from TableB a 
left join TableA b on a.table_a_id = b.id
) where value_a like concat('%',selectValue,'%')

注意:如果只用一次查询,则会报错,提示查询语句中不存在该列

string selectValue = "";//查询值
//Db为SqlSugarScopeProvider的实例
var query = Db.Queryable<TableB, TableA>((a, b) => new JoinQueryInfos(
        JoinType.Left, a.table_a_id == b.id
    ))
    .Select((a, b) => new ViewTableB()
    {
        id = a.id.SelectAll(),
        name_a = b.name,
        value_a = b.value
    });

if (!string.IsNullOrEmpty(selectValue)) {
    query = query.Where(a => a.value_a.Contains(selectValue));
}

//等价SQL
select a.* from TableB a 
left join TableA b on a.table_a_id = b.id
where value_a like concat('%',selectValue,'%')

即在生成SQL语句时,不会带着TableA的列,引起该问题的具体原因未知,仅通过跟踪代码发现该问题,可能为sqlsugar框架问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值