Where 子句上的 ServiceStack ORMLite JoinAlias
ServiceStack ORMLite JoinAlias on a Where clause
我正在尝试向使用 JoinAlias 连接的 table 添加 Where 子句,但似乎没有办法在 where 子句上指定 JoinAlias。
我尝试多次连接到同一个 table,然后根据用户输入向连接添加可变数量的 where 子句:
var userFilterList = new List<Expression<Func<LocationDb, LocationAttributesDateTimeDb, bool>>>();
Expression <Func<LocationDb, LocationAttributesDateTimeDb, bool>> joinPredicate = (loc, ext) =>
loc.LocationId == ext.LocationId && ext.AttributeId == attributeId;
query = query.Join<LocationAttributesDateTimeDb>(joinPredicate, ctx.JoinAlias($"ext{attributeId}"));
foreach (var item in userFilterList)
{
query = query.Where<LocationDb, LocationAttributesDateTimeDb>(item);
}
主要问题是,似乎没有办法将 JoinAlias 添加到 Where 子句中。如果我按原样尝试 运行 查询,我会收到有关缺少别名的异常。
如果我尝试下面的代码,我得到一个编译异常:
query = query.Where<LocationDb, LocationAttributesDateTimeDb>(item, ctx.JoinAlias($"ext{attributeId}"));
有没有一种方法可以将 JoinAlias 添加到 where 子句,而无需诉诸手动编写 Where 子句SQL?
或者,是否可以使用替代方法将我的多个请求拼接成单个 Join 谓词?
请注意,在最新的 v5.4.1 pre-release on MyGet 中,JoinAlias()
已被弃用并替换为 TableAlias()
,它使用不同的实现来替换别名,同时遍历表达式树,同时生成 SQL 语句而 JoinAlias()
通过 post 字符串替换生成的 SQL 更脆弱。
WHERE 语句中没有 TableAlias()
,因为无法确定应该在何处使用别名,下面是一些 how to use TableAlias in WHERE 条件的示例:
q.Where<Team, Teamuser>((t, u) => t.Id == Sql.TableAlias(u.TeamId, "Leader"));
q.Where<Teamuser>(u => Sql.TableAlias(u.Id, "Leader") == 1);
q.Where<Team, Teamuser>((t, u) => Sql.TableAlias(t.Id, q.DialectProvider.GetQuotedTableName(ModelDefinition<Team>.Definition)) == Sql.TableAlias(u.TeamId, "Leader")); // Workaround, but only works for fields, not constants
q.Where<Team, Teamuser>((user, leader) => Sql.TableAlias(user.Id, "Teamuser") < Sql.TableAlias(leader.Id, "Leader"));
我正在尝试向使用 JoinAlias 连接的 table 添加 Where 子句,但似乎没有办法在 where 子句上指定 JoinAlias。
我尝试多次连接到同一个 table,然后根据用户输入向连接添加可变数量的 where 子句:
var userFilterList = new List<Expression<Func<LocationDb, LocationAttributesDateTimeDb, bool>>>();
Expression <Func<LocationDb, LocationAttributesDateTimeDb, bool>> joinPredicate = (loc, ext) =>
loc.LocationId == ext.LocationId && ext.AttributeId == attributeId;
query = query.Join<LocationAttributesDateTimeDb>(joinPredicate, ctx.JoinAlias($"ext{attributeId}"));
foreach (var item in userFilterList)
{
query = query.Where<LocationDb, LocationAttributesDateTimeDb>(item);
}
主要问题是,似乎没有办法将 JoinAlias 添加到 Where 子句中。如果我按原样尝试 运行 查询,我会收到有关缺少别名的异常。
如果我尝试下面的代码,我得到一个编译异常:
query = query.Where<LocationDb, LocationAttributesDateTimeDb>(item, ctx.JoinAlias($"ext{attributeId}"));
有没有一种方法可以将 JoinAlias 添加到 where 子句,而无需诉诸手动编写 Where 子句SQL?
或者,是否可以使用替代方法将我的多个请求拼接成单个 Join 谓词?
请注意,在最新的 v5.4.1 pre-release on MyGet 中,JoinAlias()
已被弃用并替换为 TableAlias()
,它使用不同的实现来替换别名,同时遍历表达式树,同时生成 SQL 语句而 JoinAlias()
通过 post 字符串替换生成的 SQL 更脆弱。
WHERE 语句中没有 TableAlias()
,因为无法确定应该在何处使用别名,下面是一些 how to use TableAlias in WHERE 条件的示例:
q.Where<Team, Teamuser>((t, u) => t.Id == Sql.TableAlias(u.TeamId, "Leader"));
q.Where<Teamuser>(u => Sql.TableAlias(u.Id, "Leader") == 1);
q.Where<Team, Teamuser>((t, u) => Sql.TableAlias(t.Id, q.DialectProvider.GetQuotedTableName(ModelDefinition<Team>.Definition)) == Sql.TableAlias(u.TeamId, "Leader")); // Workaround, but only works for fields, not constants
q.Where<Team, Teamuser>((user, leader) => Sql.TableAlias(user.Id, "Teamuser") < Sql.TableAlias(leader.Id, "Leader"));