我使用"来自数据库的代码优先"在我的项目上创建一个模型。标准查询(没有"展开"和"选择")工作得很好,但是当包括" 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()时,它根本不起作用。当我检查网络流量时,它甚至没有命中服务器。
欢迎任何问题。在此先感谢您的帮助。
答案 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
一起生效。