使用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可以找到。只是谓词右侧是记录的列,所以它不起作用。
我做错了还是这是一个错误?
答案 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的名称,并使集合属性名称变得多元,这可能会更容易提供帮助。
希望这会有所帮助。