Уменьшение длины псевдонима таблицы в Firebird EntityFrameworkCore

#c# #entity-framework-core #firebird

#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:

Это обходной путь. Код должен быть реализован поставщиком.

Создайте два класса: 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);
}