微风查询:比较相关实体上的两列

时间:2018-10-19 13:39:57

标签: one-to-many breeze predicate one-to-one

使用Breeze,如何比较实体相关属性的两列?

 public class TableA{
   public ICollection<TableB> TableBEntity {get; set;}
}

public class TableB{
  public TableC TableCEntity {get; set;}
}

public class TableC {
  public string columnA { get; set;}
  public string columnB { get; set;}
}

var subpredicate = Predicate.create('TableCEntity.columnA', FilterQueryOp.Equals, 'TableCEntity.columnB');

var predicate = Predicate.create('TableBEntity', FilterQueryOp.Any, subpredicate);

var query1 = EntityQuery.from('TableB')
           .where(subpredicate);

var query2 = EntityQuery.from('TableA')
             .where(predicate );
上面的

query1执行没有错误。但是query2给我错误:

  

URI中指定的查询无效。在类型“ TableA”上找不到名为“ TableCEntity”的属性。

似乎该子谓词没有得到正确的评估,它在TableCEntity而不是TableA上搜索属性TableB。如果我将子谓词更改为

var subpredicate = Predicate.create('TableCEntity.columnA', FilterQueryOp.Equals, 'asamplevalue');

然后,query2可以找到。只是谓词右侧是记录的列,所以它不起作用。

我做错了还是这是一个错误?

1 个答案:

答案 0 :(得分:0)

轻巧的“ any”和“ all”运算符要求第一个表达式返回的属性(在下面的示例中为“ orders”)为非标量导航属性。即返回集合的导航属性。那么,子谓词只是针对第一个表达式返回的类型的简单谓词。

var query = EntityQuery.from("Employees")
    .where("orders", "any", "freight", ">", 950);

带有谓词的情况表示如下

var p2 = Predicate.create("freight", ">", 950);
var p1 = Predicate.create("orders", "any", p2);
var query = EntityQuery.from("Employees").where(p1);

就您而言,我不确定您要使用“ query2”做什么。 “ query2”似乎是对从“ TableA”返回的“ TableB”实体的集合的查询,但是“ subpredicate”处理的是“ TableC”实体。

如果这没有帮助,则可以使用更加直观的表名来重述TableA,B和C的名称,并使集合属性名称变得多元,这可能会更容易提供帮助。

希望这会有所帮助。