减少Firebird EntityFrameworkCore中表别名的长度

时间:2019-04-13 07:09:07

标签: c# entity-framework-core firebird

在访问条件列时,它会通过多个表,因此为联接的表生成了一个很长的别名。在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”等

1 个答案:

答案 0 :(得分:0)

这是一种解决方法。该代码应由提供商实施。

创建两个类: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);
}