breezejs:将集合合并到缓存中的现有实体时未保留orderBy

breezejs:将集合合并到缓存中的现有实体时未保留orderBy,breeze,Breeze,在缓存中,我有一个类型为“委托”的实体 然后,我运行以下代码获取MandateHistory实体的集合,然后breeze将其合并到委托实体的相应属性中: function getMandatHistory(mandatId) { var query = breeze.EntityQuery.from("MandatesHistory") .where("Mandate.Id", "==", mandatId).orderBy("Id")

在缓存中,我有一个类型为“委托”的实体

然后,我运行以下代码获取MandateHistory实体的集合,然后breeze将其合并到委托实体的相应属性中:

 function getMandatHistory(mandatId) {
            var query = breeze.EntityQuery.from("MandatesHistory")
                .where("Mandate.Id", "==", mandatId).orderBy("Id")
                .expand("Mandate").skip(offset).take(pageSize).inlineCount(true);

            return manager.executeQuery(query.using(service));
 }
注意,orderBy子句得到尊重,结果按Id正确排序


但是,委托实体集合属性中的项目未排序。我必须在这里做一些特殊的事情吗?

对集合导航属性返回的值进行排序不是Breeze所做的事情。它将对查询结果进行排序,但如果您希望对实体的某个集合属性进行排序并保持排序,则需要自己管理该属性

我认为你最好的两个选择是要么

1显示前进行排序。i、 e.在显示任何集合之前,对其调用排序方法。根据您使用的MVVM框架的不同,通常会有一个“绑定”来实现这一点


2订阅导航属性返回的阵列上的Breeze arrayChanged事件,并在看到更改事件时调用阵列上的sort。注意:如果您订阅了许多实体上的许多属性,那么这可能会很昂贵

对集合导航属性返回的值进行排序并不是Breeze所做的事情。它将对查询结果进行排序,但如果您希望对实体的某个集合属性进行排序并保持排序,则需要自己管理该属性

我认为你最好的两个选择是要么

1显示前进行排序。i、 e.在显示任何集合之前,对其调用排序方法。根据您使用的MVVM框架的不同,通常会有一个“绑定”来实现这一点


2订阅导航属性返回的阵列上的Breeze arrayChanged事件,并在看到更改事件时调用阵列上的sort。注意:如果您订阅了许多实体上的许多属性,那么这可能会很昂贵

谢谢你的回复。我不太确定breeze在内部是如何工作的,但我认为executeQuery方法返回的数据只会影响实体的collection属性,在这种情况下,排序应该与服务器返回的数据保持一致。集合的排序方式与返回数据的排序方式不同,这一事实表明breeze以某种方式重新排序了这些项目,我不确定是否这样做。也许我不理解您的回答,但您似乎没有解释为什么要重新排序集合?Breeze中的集合属性从不排序,它们被填充,推送到现有阵列上,因为数据是从服务器返回的,如果同一实体通过不同的查询返回多次,它只是合并到现有实例中,因此不会再次进行重新排序。你可能会因为这种行为而幸运,但指望它是个坏主意。此外,如果您的排序键更改了服务器或客户端上的值,您仍然需要对此进行说明。您好@JayTraband,我如何为类型的所有实体订阅arrayChanged?例如,如果我有一个具有orders导航属性的Book实体,如何使其在orders属性发生任何更改时都能收到事件通知并对数组进行排序?Book.orders.arrayChanged.subscribe函数arrayChangedArgs{var addedEntities=arrayChangedArgs.added;var removedEntities=arrayChanged.removed;};感谢您的回复。我不太确定breeze内部是如何工作的,但我认为executeQuery方法返回的数据只会影响实体的collection属性,在这种情况下,排序应该与服务器返回的排序保持一致。事实上,集合的排序方式与e返回的数据,表明breeze以某种方式重新排序了项目,我不确定。也许我不理解您的回答,但您似乎没有解释为什么要重新排序集合?breeze中的集合属性从不排序,它们被填充,推送到现有阵列上,因为数据是从服务器返回的,如果相同的话实体多次由不同的查询返回,它只是合并到现有实例中,因此不会再次发生重新排序。这种行为可能会让您感到幸运,但指望它是个坏主意。此外,如果排序键更改了服务器或客户机上的值,您仍然需要对其进行说明。Hi@JayTraband,我如何为一种类型的所有实体订阅arrayChanged?例如,如果我有一个具有orders导航属性的Book实体,我如何使其在orders属性发生任何更改时都能收到事件通知并对数组进行排序?Book.orders.arrayChanged.subscribe函数ArrayChangedArrayChanged{var addedEntities=arrayChangedArgs.added;var re movedEntities=arrayChanged.removed;};