无实体执行原生sql查询后接着调用Where无效 返回

SqlSugar 沟通中
9 393

数据库为sqlserver,以下是我的代码,在Db.SqlQueryable<object>($"SELECT * FROM ({sqlStr}) AS table2");之后接着调用的Select无效。


经过初步debug定位到问题出在QueryBuilder类下的GetSqlQuerySql函数中,具体修复方式因此类调用的地方过多,不敢随意修改,请大佬们看下


```csharp

            List<SelectModel> select = SelectModel.Create

                (

                    new SelectModel() { FieldName = "t.name" },

                    new SelectModel() { FieldName = "s.name" }

                );

            ObjectFuncModel whereObj = ObjectFuncModel.Create("ContainsArray", "{string}:" + Db.Utilities.SerializeObject(tables.Select(s => s.Name)), "t.name");

            var query = Db.Queryable<object>()

                .AS("sys.tables", "t")

                .Where(whereObj)

                .AddJoinInfo("sys.schemas", "s", ObjectFuncModel.Create("Equals", "t.schema_id", "s.schema_id"), JoinType.Left)

                .Select(select);


            string sqlStr = query.ToSqlString();


            query = Db.SqlQueryable<object>($"SELECT * FROM ({sqlStr}) AS table2");


            List<SelectModel> select2 = SelectModel.Create

            (

                new SelectModel() { FieldName = "t.name" }

            );

            query = query.Select(select2);

            sqlStr = query.ToSqlString();


            var data = query.ToList();

```

热忱回答9

  • padishah padishah VIP0
    1个月前

    不好意思标题写错了,应该是

    无实体执行原生sql查询后接着调用Select无效

    0 回复
  • fate sta fate sta VIP0
    1个月前

    t.name

    这个是错的。

    没有前缀了。sqlqueryable合并成一个表了

    0 回复
  • fate sta fate sta VIP0
    1个月前

    另外queryable不能用2次            sqlStr = query.ToSqlString();  这个删掉。

    0 回复
  • padishah padishah VIP0
    1个月前

    @fate sta:按你说的方式修改后还是无效,我测试了一下,发现生成的sql语句是Select *,也就是后面加的那句query.Select(select2)并未生效,以下为修改后的完整代码


                SqlSugarClient Db = new SqlSugarClient(new ConnectionConfig()

                {

                    ConnectionString = "连接字符串",

                    DbType = SqlSugar.DbType.SqlServer,

                    IsAutoCloseConnection = true,

                });


                var tables = Db.DbMaintenance.GetTableInfoList();


                List<SelectModel> select = SelectModel.Create

                    (

                        new SelectModel() { FieldName = "t.name" },

                        new SelectModel() { FieldName = "s.name" }

                    );

                ObjectFuncModel whereObj = ObjectFuncModel.Create("ContainsArray", "{string}:" + Db.Utilities.SerializeObject(tables.Select(s => s.Name)), "t.name");

                var query = Db.Queryable<object>()

                    .AS("sys.tables", "t")

                    .Where(whereObj)

                    .AddJoinInfo("sys.schemas", "s", ObjectFuncModel.Create("Equals", "t.schema_id", "s.schema_id"), JoinType.Left)

                    .Select(select);


                string sqlStr = query.ToSqlString();


                query = Db.SqlQueryable<object>($"SELECT * FROM ({sqlStr}) AS table2");


                List<SelectModel> select2 = SelectModel.Create

                (

                    new SelectModel() { FieldName = "name" }

                );

                query = query.Select(select2);


                var data = query.ToList();


    0 回复
  • fate sta fate sta VIP0
    1个月前

    以生成的SQL为准。具体描述清楚哪个地方SQL不对。

    0 回复
  • fate sta fate sta VIP0
    1个月前

    目前代码最外层的SELECT是有效的。

    0 回复
  • padishah padishah VIP0
    1个月前

    @fate sta:我最后加不加那句query.Select(select2),最后生成的SQL语句都是这样的,这显然不符合预期
    SELECT * FROM (SELECT [t].[name] AS [t.name] , [s].[name] AS [s.name] FROM [sys].[tables] [t] Left JOIN [sys].[schemas] [s] ON ([t].[schema_id] = [s].[schema_id])   WHERE ([t].[name] IN ('Products','Products2')) ) AS table2

    0 回复
  • padishah padishah VIP0
    1个月前

    符合预期的生成的语句应该是这样的

    SELECT [name] FROM (SELECT * FROM (SELECT [t].[name] AS [t.name] , [s].[name] AS [s.name] FROM [sys].[tables] [t] Left JOIN [sys].[schemas] [s] ON ([t].[schema_id] = [s].[schema_id])   WHERE ([t].[name] IN ('Products','Products2')) ) AS table2) AS t

    0 回复
  • padishah padishah VIP0
    1个月前

    你可以把我的代码复制过去跑一下,而且我已经定位到问题出在Sqlsugar内部QueryBuilder类下的GetSqlQuerySql函数中,他会直接返回最开始SqlQueryable中生成的oldSQL

    0 回复