您是否定义PersonBrief
为 EntityType?我打赌不会……特别是考虑到您在示例中将其称为“personBrief”。该toType()
方法用于转换一个简单的、扁平的、已知的 EntityType。所以我认为你在这里有点偏离轨道。
为什么不投到Person
?确实缺少一些 Person 材料(如在 CCJS 中......虽然在这个您投影所有数据属性的特定示例中没有)。但这非常简单。就写吧toType('Person')
。你试过吗?
如果您确实想在客户端上定义这样的 EntityType,您可以按照文档中的说明进行操作。如果你这样做,你可以使用该toType()
类型的强制转换,Breeze 将在缓存中跟踪它。当然,将这样的东西保存回服务器是另一回事。这是可行的......它可能是一种DTO......但你必须在服务器上编写拦截逻辑并将数据转换为真实的服务器端持久实体,这条路径超出了我的回答范围.
这是一些代码...写在我的脑海中...但它应该为您指明正确的方向。请注意,我假设它Pet
是 EntityType,而不是 ComplexType!目前 Breeze 不支持 ComplexTypes 数组(支持但现在不支持)。
// 为给定的 MetadataStore 定义 PersonBrief 类型
函数 addPersonBriefType(metadataStore) {
var perType = metadataStore.getEntityType('Person');
var 类型 = 新微风.EntityType({
shortName: 'PersonBrief',
命名空间:perType.namespace
});
var idProperty = 新的微风.DataProperty({
nameOnServer: 'Id',
数据类型:微风.DataType.Int32,
isPartOfKey:真,
});
type.addProperty(idProperty);
type.addProperty(新微风.DataProperty({ nameOnServer:'Name'}));
// 这里是你如何定义你的 Pets 集合
// 我假设你已经在元数据中有一个 Pet 类型并且
// 它有一个反向导航返回到 Person
// 获取从 Person 到 Pets 的导航属性
var assoc = perType.getNavigationProperty('Pets');
type.addProperty(新的微风.NavigationProperty({
nameOnServer: '宠物',
isScalar: false, // 它是一个集合
entityTypeName: assoc.entityType.name,
foreignKeyNames: assoc.inverse.foreignKeyNames,
关联名称: assoc.associationName
}));
metadataStore.addEntityType(type);
返回类型;
}
我能够在 DocCode 示例EmployeePartial
的metadataTests.jsPets
中执行类似的操作,其中等效于is Orders
。可比较的投影查询是这样的:
var 查询 = 微风.EntityQuery.from('Employees')
.where('EmployeeID', 'eq', 1)
.select('EmployeeID, FirstName, LastName, Orders')
.toType('EmployeePartial')
您的sumOfPetAges
计算应该可以工作,因为有一种PersonBrief
类型需要补充。
可以肯定的是,我自己正在飞行。我知道它可以工作,即使我不能对我在这里编写的这段特定代码发誓。让我们知道这对您有何影响。
ps 虽然您应该能够从 to 导航PersonBrief
,Pets
但不要期望从 a 导航回Pet
a PersonBrief
;该导航属性未定义。