expand()和select()不适用于Breeze WebApi2 1.5.0和EF 6.0.0

时间:2015-01-31 07:44:04

标签: entity-framework select breeze asp.net-web-api2 expand

我使用"来自数据库的代码优先"在我的项目上创建一个模型。标准查询(没有"展开"和"选择")工作得很好,但是当包括" expand"时它们不起作用。和"选择"。可能是什么问题?

修改

以下是代码示例:

        /**
         * Find charges by location and category
         * @method
         * @param {int, int} locationId, categoryId
         * @return {object array}
        */
        this.filter = function (params) {
            var p1 = breeze.Predicate.create('locationId', '==', params.locationId),
                p2 = breeze.Predicate.create('categoryId', '==', params.categoryId),

                query = breeze.EntityQuery
                    .from(resourceName).expand('ChargeItem').select('id,chargeItemId,chargeItem.name');

            if (params.locationId && params.categoryId) return executeQuery(query.where(p1.and(p2)));
            if (!params.locationId && params.categoryId) return executeQuery(query.where(p2));
            if (params.locationId && !params.categoryId) return executeQuery(query.where(p1));

            return executeCacheQuery(query);
        };

        function executeCacheQuery(query) {
            return manager().executeQueryLocally(query);
        }

        function executeQuery(query) {
            return manager().executeQuery(query.using(breeze.FetchStrategy.FromLocalCache))
                .then(function (cacheData) {
                    if (cacheData.results.length == 0) {
                        return manager().executeQuery(query.using(breeze.FetchStrategy.FromServer))
                            .then(function (serverData) { return serverData.results; });
                    } else return cacheData.results;
                });
        }

        function manager() {
            return entityManagerProvider.manager();
        }

    };

resourceName 是指Breeze ApiController中的Charges函数(对于此实例, breeze / charges )。 Charge表(在数据库中)有三个外键: LocationId CategoryId ChargeItemId 。我想通过 locationId 和/或 categoryId 查找费用并选择费用 ID chargeItemId chargeItem.Name (ChargeItem表中的名称字段)。使用expand()和select()时,它根本不起作用。当我检查网络流量时,它甚至没有命中服务器。

欢迎任何问题。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我敢打赌,查询失败了,你只是没有看到错误。

请注意,如果查询失败,您不会收到错误。您有then()条款,但没有catch()条款。

第1课 - 始终检查承诺中的错误。

为什么你的查询失败了?我怀疑你在expand()子句中拼错了导航属性路径。

第2课 - 在撰写查询时,始终使用客户端拼写作为属性名称。

您显然正在使用NamingConvention.camelCase将服务器上的PascalCase属性名称(“ChargeItemId”)映射到客户端上的camelCase属性名称(“chargeItemId”)。

您应该在客户端的所有位置使用camelCase拼写...包括在expand子句中。如果您将查询的相关部分更改为.expand("chargeItem")

,我将会工作

但请先返回并输入catch回调,以便查看错误。然后修正错误。

建议

我不知道这是不是你真正的疑问。如果是,您可以通过逐步构建查询来大大简化它,可能是这样的:

var query = breeze.EntityQuery.from(resourceName)
                  .expand('chargeItem')
                  .select('id, chargeItemId, chargeItem.name');

if (params.locationId) { 
    query = query.where('locationId', '==', params.locationId); 
}

if (params.categoryId) { 
    query = query.where('locationId', '==', params.categoryId); 
}   

return executeCacheQuery(query);

这很有效,因为Breeze ANDs where一起生效。