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