#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);
}