c# - Where 子句上的 ServiceStack ORMLite JoinAlias

标签 c# ormlite-servicestack predicatebuilder

我正在尝试将 Where 子句添加到通过 JoinAlias 连接的表中,但似乎没有办法在 where 子句上指定 JoinAlias。

我尝试多次连接到同一个表,然后根据用户输入向连接中添加数量可变的 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( ) 通过对生成的更脆弱的 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"));

关于c# - Where 子句上的 ServiceStack ORMLite JoinAlias,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54859219/

相关文章:

c# - PredicateBuilder:OR 条件嵌套在 .And() 中

c# - 如何启用特殊键(ctrl-c、ctrl-v、tab、delete)Windows.Form.WebBrowser 控件

c# - 数据源不支持服务端数据分页

postgresql - Servicestack ORMLite - 在 PostgreSQL 中使用 XML 字段

c# - 服务堆栈 : Detect if IDbConnection is "busy" - is a DataReader is open (trying to implement a "connection pool")

c# - 如何在新的 ormlite api 中设置命令超时

linq - PredicateBuilder 可以生成跨多个表的谓词吗?

C# 如何阻止用户使用程序创建的Excel应用程序

c# - 如何使 TextBox 随着用户的输入不断更新?