【问题标题】:Table alias lost when using joins with SqlExpressionSelectFilter将连接与 SqlExpressionSelectFilter 一起使用时表别名丢失
【发布时间】:2019-04-08 15:06:42
【问题描述】:

我有一种情况,应根据相关表中的值排除记录。当使用带有 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

【问题讨论】:

    标签: servicestack ormlite-servicestack


    【解决方案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);
    

    【讨论】:

    • 不幸的是,查询最终在基本表达式中使用了自定义别名,但连接的默认别名:SELECT st.Id, st.FirstTableId, st.Deleted FROM SecondTable st LEFT JOIN FirstTable ON ( SecondTable.FirstTableId = FirstTable.Id) WHERE (st.Id = @0) AND (FirstTable.Deleted @1)
    • @Will 它在 SelectFilter 中没有具体类型,因此无法知道它可以使用哪个表别名,您可以使用与表相同的名称作为别名,例如here's a live example on Gistlyn.
    • 能否将 PrefixFieldWithTableName 应用于特定表的所有查询?
    • @Will 最简单的方法是将其包装在您自己的 ext 方法(例如FromTable&lt;T&gt;)中,该方法根据您的偏好初始化查询。我刚刚添加了额外的全局配置选项,您可以使用 OrmLiteConfig.IncludeTablePrefixes = trueOrmLiteConfig.SqlExpressionInitFilter = q =&gt; q.PrefixFieldWithTableName = true 执行此操作。此更改适用于最新的 v5.5.1,现在为 available on MyGet
    猜你喜欢
    • 2021-08-22
    • 2021-04-20
    • 1970-01-01
    • 2019-11-19
    • 2017-11-05
    • 1970-01-01
    • 2021-08-31
    • 2016-02-05
    • 2014-04-24
    相关资源
    最近更新 更多