Typescript 如何在Where子句中使用客户端属性

Typescript 如何在Where子句中使用客户端属性,typescript,breeze,Typescript,Breeze,我只有客户端Metadatstore: initialize = (metadataStore) => { metadataStore.addEntityType({ shortName: "AppsListHelper", namespace: NFL.settings.entityNamespace, dataProperties: { Path: { dataType: "String" },

我只有客户端Metadatstore:

initialize = (metadataStore) => {
    metadataStore.addEntityType({
        shortName: "AppsListHelper",
        namespace: NFL.settings.entityNamespace,
        dataProperties: {
            Path: { dataType: "String" },
            Title: { dataType: "String", isPartOfKey: true },
            Author: { dataType: "String" },
            Description: { dataType: "String" },
            ImageUrl: { dataType: "String" },
            IsFavourite: { dataType: "Boolean" },
            AppTypeName: { dataType: "String", isPartOfKey: true },
            Departments: { dataType: "String" },
            AlwaysShownTo: { dataType: "String" },
            AvailableTo: { dataType: "String" },
            HasAccess: { dataType: "Boolean" },
            Keywords: { dataType: "String" }
        }
    });

    metadataStore.registerEntityTypeCtor('AppsListHelper', function () { this.IsMyApp = ko.observable(false); });
}
我想添加附加属性“IsMyApp”仅用于客户端使用-在我的一个GET方法中,我将此属性设置为“true”:

    querySucceded = (data) => {   
    ko.utils.arrayForEach(data.results, (item: m_application.Application) => {
        item.IsMyApp(true);
    });
    return this.apps(data.results);
}
现在,我尝试通过breeze manager使用query查询本地数据:

private getLocal = (resource) => {
    var query = this.EntityQuery.from(resource).where('IsMyApp', '==', 'true').toType("AppsListHelper");
    return this.breezeManager.executeQueryLocally(query);
}
但“什么也不发生”视图已加载但为空,在“where子句”的删除行之后,它将返回所有数据

任何帮助都将不胜感激:


我更详细的场景如下:我有两个视图:“我的应用”和“所有应用”。由于所有实体都是同一类型的“AppsListHelper”,在我从服务器接收到两个包含数据的列表后,它们被缓存到一起-这导致相同的数据显示在两个视图上,这对我来说是理解的,当从本地缓存中提取时。所以,作为第一个解决方案,我只想在客户端添加额外的标志'IsMyApp',因为我在服务器上确实不需要它,并根据该标志的值来区分数据,以获得适当的视图

您只能为Breeze知道的属性创建查询。在您的情况下,您正在将属性添加到构造函数中,但Breeze并不真正知道您正在这样做,只允许您使用一个方法来完成。如果这有意义的话

您可能只是想过滤数组,那么为什么不查询满足其他条件的对象,然后过滤它们呢?这可能不是有效的TypeScript,但应该告诉您正确的方法-

var filteredResults = ko.utils.arrayFilter(data.results, function (result) {
    return result.IsMyApp() === true;
});

@PKad是正确的,Breeze查询忽略无法识别的属性。您可以按照他的建议过滤缓存的查询结果

未映射的属性是另一个要考虑的选项。Breeze已知未映射属性,但未映射到数据库,因此不会在服务器上持久化。它是一个仅限客户端的扩展

可以在客户机上定义元数据时定义未映射属性,也可以在自定义构造函数中定义该属性并将其注册到类型


然后,您可以在DocCode:entityExtensionTests测试中查询它。

我在文章中添加了更多细节。谢谢