【.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框架问题

.NET Core使用SqlSugar进行数据库操作的步骤如下: 1. 首先,确保你已经安装了SqlSugar的NuGet包。可以通过在项目文件中添加以下依赖项来安装SqlSugar: ```xml <ItemGroup> <PackageReference Include="SqlSugar" Version="x.x.x" /> </ItemGroup> ``` 请将`x.x.x`替换为你想要使用SqlSugar版本号。 2. 在你的项目中创建一个Model类,用于映射数据库表。例如,你可以创建一个名为`User`的类,并在其中定义表的字段和属性: ```csharp public class User { [SugarColumn(IsPrimaryKey = true)] public Guid Id { get; set; } [SugarColumn(ColumnDataType = "nvarchar(30)")] public string Name { get; set; } [SugarColumn(ColumnDataType = "nvarchar(255)")] public string Password { get; set; } } ``` 3. 创建一个仓储层(Repository)来进行数据访问。你可以在仓储层中使用SqlSugar的API来执行增删改查操作。以下是一个简单的示例: ```csharp public class UserRepository { private readonly SqlSugarClient _db; public UserRepository(string connectionString) { _db = new SqlSugarClient(new ConnectionConfig { ConnectionString = connectionString, DbType = DbType.SqlServer, IsAutoCloseConnection = true }); } public List<User> GetAllUsers() { return _db.Queryable<User>().ToList(); } public void AddUser(User user) { _db.Insertable(user).ExecuteCommand(); } public void UpdateUser(User user) { _db.Updateable(user).ExecuteCommand(); } public void DeleteUser(Guid userId) { _db.Deleteable<User>().In(userId).ExecuteCommand(); } } ``` 在上面的示例中,我们创建了一个`UserRepository`类,它接受一个连接字符串作为参数,并使用该连接字符串初始化`SqlSugarClient`对象。然后,我们可以在仓储层中定义各种方法来执行数据库操作,例如获取所有用户、添加用户、更新用户和删除用户。 请注意,上述示例仅为演示目的,你可以根据自己的需求进行更改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值