在Where子句上的ServiceStack ORMLite JoinAlias

时间:2019-02-25 03:45:14

标签: c# ormlite-servicestack predicatebuilder

我正在尝试向与JoinAlias联接的表中添加Where子句,但是似乎没有办法在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谓词中?

1 个答案:

答案 0 :(得分:1)

请注意,在最新的v5.4.1 pre-release on MyGet JoinAlias()中已弃用并替换为TableAlias(),它使用了另一种实现,该实现在走表达式树的同时生成SQL语句时使用别名来代替别名,而{{ 1}}通过在生成的SQL上使用后字符串替换来工作,这更加脆弱。

WHERE语句中没有JoinAlias(),因为无法确定应在何处使用别名,下面是how to use TableAlias in WHERE条件的一些示例:

TableAlias()