Table 将连接与 SqlExpressionSelectFilter 结合使用时别名丢失
Table alias lost when using joins with SqlExpressionSelectFilter
我遇到的情况是,根据相关 table 中的值,应该排除记录。将连接与 SqlExpressionSelectFilter 结合使用时,生成的 SQL 不会对部分查询使用 table 别名。我是 运行 ServiceStack 5.5.
OrmLiteConfig.SqlExpressionSelectFilter = q => {
if (q.ModelDef.ModelType.HasInterface(typeof(IJoinFilter))) {
q.LeftJoin<IJoinFilter, FirstTable>((f, j) => f.FirstTableId == j.Id)
.Where<FirstTable>(j => j.Deleted != true);
}
};
然后只需 select 从中获取:
db.Select(db.From<SecondTable>().Where<SecondTable>(x => x.Id == 1));
这会生成如下内容:
SELECT SecondTable.Id, SecondTable.FirstTableId, SecondTable.Deleted
FROM SecondTable
LEFT JOIN FirstTable ON (SecondTable.FirstTableId = FirstTable.Id)
WHERE (Id = 1) AND (FirstTable.Deleted <> 1)
注意 where 子句中的 Id 没有前缀 'SecondTable'。还有一些情况 select 子句不包含别名。
是否支持 select 过滤器中的联接?有没有推荐的方法我应该改为执行这种全局过滤器?
我在这里创建了一个快速复制:https://github.com/TheScobey/OrmliteSelectFilterIssue
SqlExpressionSelectFilter
在创建表达式后应用,因此不会影响以前的表达式,您可以尝试为来源 table 提供一个别名:
db.Select(db.From<SecondTable>(db.TableAlias(nameof(SecondTable)))
.Where<SecondTable>(x => x.Id == 1));
另一种方法是强制查询在查询中包含 table 前缀,例如:
var q = db.From<SecondTable>();
q.PrefixFieldWithTableName = true;
q.Where<SecondTable>(x => x.Id == 1);
我遇到的情况是,根据相关 table 中的值,应该排除记录。将连接与 SqlExpressionSelectFilter 结合使用时,生成的 SQL 不会对部分查询使用 table 别名。我是 运行 ServiceStack 5.5.
OrmLiteConfig.SqlExpressionSelectFilter = q => {
if (q.ModelDef.ModelType.HasInterface(typeof(IJoinFilter))) {
q.LeftJoin<IJoinFilter, FirstTable>((f, j) => f.FirstTableId == j.Id)
.Where<FirstTable>(j => j.Deleted != true);
}
};
然后只需 select 从中获取:
db.Select(db.From<SecondTable>().Where<SecondTable>(x => x.Id == 1));
这会生成如下内容:
SELECT SecondTable.Id, SecondTable.FirstTableId, SecondTable.Deleted
FROM SecondTable
LEFT JOIN FirstTable ON (SecondTable.FirstTableId = FirstTable.Id)
WHERE (Id = 1) AND (FirstTable.Deleted <> 1)
注意 where 子句中的 Id 没有前缀 'SecondTable'。还有一些情况 select 子句不包含别名。
是否支持 select 过滤器中的联接?有没有推荐的方法我应该改为执行这种全局过滤器?
我在这里创建了一个快速复制:https://github.com/TheScobey/OrmliteSelectFilterIssue
SqlExpressionSelectFilter
在创建表达式后应用,因此不会影响以前的表达式,您可以尝试为来源 table 提供一个别名:
db.Select(db.From<SecondTable>(db.TableAlias(nameof(SecondTable)))
.Where<SecondTable>(x => x.Id == 1));
另一种方法是强制查询在查询中包含 table 前缀,例如:
var q = db.From<SecondTable>();
q.PrefixFieldWithTableName = true;
q.Where<SecondTable>(x => x.Id == 1);