如何在 breeze 中对扩展实体使用谓词

How to use predicates on expanded entities in breeze

假设我有一个名为 Foo 的实体,它有一个 Bars 的列表。 Bars 还包含一个名为 isDeleted 的字段,它指示特定柱已被软删除。我希望能够查询特定的 Foo 并使用 Breeze 过滤掉 Javascript 文件中软删除的 Bars。我认为这会起作用...

var query = breeze.EntityQuery.from('Foo')
        .where('Id', '==', id).and('Bars.IsDeleted', '==', false)
        .expand('Bars');

但是没有,有人可以告诉我如何在 breeze 中执行此操作吗?如果唯一的解决方案是在 BreezeController 中编写一个方法并使用标准的 LINQ 语法,那么我可以接受,但我只想先看看它是否能在 Breeze 中工作。

查询 will automatically "AND" together. If you want to do this explicity, you need to use the breeze.Predicate 对象上的多个 .where() 链作为您的 where 参数,如下所示:

var query = breeze.EntityQuery.from('Foo').expand('Bars')
    .where(new breeze.Predicate('Id', 'eq', id)
                     .and('Bars.IsDeleted', 'eq', false));

您还可以选择对 Predicate 对象使用 .or 或任何其他方法,其中大部分都正确链接。

编辑:这是使用多个 .where 调用的示例:

    var query = breeze.EntityQuery.from('Foo').expand('Bars')
                .where('Id', 'eq', id)
                .where('Bars.IsDeleted', 'eq', false);

目前 Breeze 不支持过滤 'expands'。即仅 returning 满足特定条件的 'expanded' 实体。这是因为很少有后端服务器和持久性库提供支持这一点的机制。

然而,您可以做的是 反转 查询以获得您需要的内容。即

var query = breeze.EntityQuery.from('Bars').expand('Foo')
    .where(new breeze.Predicate('Foo.Id', 'eq', id)
                 .and('IsDeleted', 'eq', false));

这假设 'Bar' 个实体每个都有一个标量 'Foo' 属性。

这将 return 只是您想要的每个 'Bars' 及其关联的 'Foo' 实体。这是可行的,因为 Breeze 允许嵌套标量谓词。即 'Foo.Id'。