【问题标题】:Reducing length of table alias in Firebird EntityFrameworkCore减少 Firebird EntityFrameworkCore 中表别名的长度
【发布时间】:2019-04-13 07:09:07
【问题描述】:

当访问一个条件列要经过多个表时,为连接的表生成了一个很长的别名。在 Firebird 中,最大标识符限制为 31 个字符。是否可以影响生成别名的大小?

我使用 .net core 2.1 和 FirebirdSql.EntityFrameworkCore.Firebird 6.6.0

抽象例子:

class Table1
{
    int id
    int value
    int idTable2
    [ForeignKey("idTable2")]
    Table2 table2
}
class Table2
{
    int id
    int idTable3
    [ForeignKey("idTable3")]
    Table3 table3
}
class Table3
{
    int id
    bool condition
}

当我这样做时:

var result = Table1.where(t => t.table2.table3.condition).select(t => value)

生成查询:

SELECT
    value
FROM
    Table1 AS "r"
    LEFT JOIN Table2 AS "r.Table2" ON "r"."idTable2" = "r.Table2"."id"
    LEFT JOIN Table3 AS "r.Table2.Table3" ON "r.Table2"."IdTable3" = "r.Table2.Table3"."id"
WHERE
    "r.Table2.Table3"."condition"

是否可以将可连接表的别名设为主表?如“a”、“b”等。

【问题讨论】:

    标签: c# entity-framework-core firebird


    【解决方案1】:

    这是一种解决方法。代码应该由Provider实现。

    创建两个类:MyFbSqlQueryCompilationContext 和 MyFbSqlQueryCompilationContextFactory(见下文)。

    设置 DbContext 的位置:

            optionsBuilder.UseFirebird(connectionString)
                .ReplaceService<IQueryCompilationContextFactory, MyFbSqlQueryCompilationContextFactory>();
    
    
    public class MyFbSqlQueryCompilationContext : RelationalQueryCompilationContext
    {
    
        public MyFbSqlQueryCompilationContext(
            QueryCompilationContextDependencies dependencies,
            ILinqOperatorProvider linqOperatorProvider,
            IQueryMethodProvider queryMethodProvider,
            bool trackQueryResults)
            : base(
                dependencies,
                linqOperatorProvider,
                queryMethodProvider,
                trackQueryResults)
        {
        }
    
        public override int MaxTableAliasLength => 31;
    }
    
    public class MyFbSqlQueryCompilationContextFactory : RelationalQueryCompilationContextFactory
    {
        public MyFbSqlQueryCompilationContextFactory(
            QueryCompilationContextDependencies dependencies,
            RelationalQueryCompilationContextDependencies relationalDependencies)
            : base(dependencies, relationalDependencies)
        {
        }
    
        public override QueryCompilationContext Create(bool async)
            => async
                ? new MyFbSqlQueryCompilationContext(
                    Dependencies,
                    new AsyncLinqOperatorProvider(),
                    new AsyncQueryMethodProvider(),
                    TrackQueryResults)
                : new MyFbSqlQueryCompilationContext(
                    Dependencies,
                    new LinqOperatorProvider(),
                    new QueryMethodProvider(),
                    TrackQueryResults);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 2014-12-31
      • 1970-01-01
      • 2012-08-06
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      相关资源
      最近更新 更多