与SqlExpressionSelectFilter结合使用时,表别名丢失

时间:2019-04-08 06:26:42

标签: servicestack ormlite-servicestack

我有一种情况,应根据相关表中的值排除记录。当将联接与SqlExpressionSelectFilter一起使用时,生成的SQL将不使用表别名作为查询的一部分。我正在运行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);
    }
};

只需使用以下命令从中进行选择:

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子句将不包含别名。

是否支持选择过滤器中的联接?有没有建议的方法应该代替我进行这种全局过滤?

我在此处创建了一个快速复制:https://github.com/TheScobey/OrmliteSelectFilterIssue

1 个答案:

答案 0 :(得分:1)

SqlExpressionSelectFilter是在创建表达式后应用的,因此不会影响以前的表达式,您可以尝试使用以下方式为Source From表赋予别名:

db.Select(db.From<SecondTable>(db.TableAlias(nameof(SecondTable)))
    .Where<SecondTable>(x => x.Id == 1));

另一种方法是强制查询在查询中包括表前缀,例如:

var q = db.From<SecondTable>();
q.PrefixFieldWithTableName = true;
q.Where<SecondTable>(x => x.Id == 1);