无实体执行原生sql查询后接着调用Where无效 返回
padishah 发布于1个月前
数据库为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 VIP0
1个月前不好意思标题写错了,应该是
无实体执行原生sql查询后接着调用Select无效
0 回复 -
fate sta VIP0
1个月前t.name
这个是错的。
没有前缀了。sqlqueryable合并成一个表了
0 回复 -
fate sta VIP0
1个月前另外queryable不能用2次 sqlStr = query.ToSqlString(); 这个删掉。
0 回复 -
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 VIP0
1个月前以生成的SQL为准。具体描述清楚哪个地方SQL不对。
0 回复 -
fate sta VIP0
1个月前目前代码最外层的SELECT是有效的。
0 回复 -
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 table20 回复 -
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 VIP0
1个月前你可以把我的代码复制过去跑一下,而且我已经定位到问题出在Sqlsugar内部QueryBuilder类下的GetSqlQuerySql函数中,他会直接返回最开始SqlQueryable中生成的oldSQL
0 回复