EnumType的Breeze Local Query

时间:2014-06-01 11:17:53

标签: enums breeze

我为Lookups设置WebApi方法,返回

 public Object Lookups()
 {
    var durations = Enum.GetNames(typeof(Duration));
    var status = Enum.GetNames(typeof(Status));
    return new { durations, status };
 }

然后我用breeze

查询服务器
 return entityQuery.from('Lookups')
         .using(manager).execute()
         .then(querySucceeded, _queryFailed);

    function querySucceeded(data) {

        console.log("Retrieving [Lookups] " + data);
        return true;
   }

现在稍后我希望从缓存中获取这些查找,请注意,在元数据中,我的Enum位于" EnumType",看起来像breeze尚未提供从服务器端检索枚举的支持所以我返回他们作为一个查找。现在,我想知道如何让他们在当地减少额外往返?

由于

2 个答案:

答案 0 :(得分:0)

常规Web API支持.NET Enum。它们的类型名称出现在元数据中,并由Breeze识别。

我认为枚举值不会自动传播到客户端(这样会很好),但您可以通过其他方式将它们发送到客户端,例如您使用查找端点。

  

Web API OData 也不支持枚举。事实上,如果属性返回枚举,它就会死亡,而WCF数据服务则满足于处理它们的字符串名称。目前我们无法对Web API OData的这个缺陷做些什么。

枚举不是实体,我认为您不想将它们伪造为客户端上的实体。你可以但不会。

因为它们不是实体,所以Breeze不会将它们存储在缓存中。您的查询返回JavaScript简单对象,而不是实体,并且没有可以找到它们的缓存查询。

我认为在您的情况下我会做的是将这些枚举值捕获为datacontext服务的数组属性...您正在使用的相同服务(我希望)封装基于Breeze的数据访问活动,以便ViewModels与datacontext交互,而不是直接与Breeze组件交互。

因此,您的查询查询成功回调可能如下所示:

// Inside the datacontext service
var isReady = null;
var dc = {
     ready: ready,
     Duration: [],
     Status: [],
     ...
}

return dc;
///////////////
function ready() {
   return isReady || (isReady = getReady())); // returns the ready promise
}

function getReady() {
   // stuff you do to prime the pump
   // returns a promise that is "true" when you've completed your
   // preparatory async tasks such as fetching lookups
   ...
}
...
function lookupsQuerySucceeded(data) {
    console.log("Retrieved [Lookups] " + data);
    dc.Duration = data.results.Duration;
    dc.Status = data.results.Status;
    return true;
}

我遗漏了细节,但我希望你明白这一点。

使用这种技术只有一次访问服务器,一次访问以获取初始内容并填充缓存和/或(在本例中)datacontext本身的属性。

答案 1 :(得分:0)

如果您的元数据(我已加载到变量window.app.metadata中)包含枚举值,那么您可以

<强> 1。编写js代码以在js字典中提取这些枚举

   JSON.parse(window.app.metadata).schema.enumType.forEach(function (enumType) {
        var newEnumValues = [];

        enumType.member.forEach(function (enumValue) {
            var newEnumValue = { id: enumValue.value, name: enumValue.name };
            newEnumValues.push(newEnumValue);
        });

        enumDictionary[enumType.name] = newEnumValues;
    });

<强> 2。编写一个方法来获取基于枚举名称和id的枚举值。

    function GetEnumDictionaryValue(enumName, enumValueId) {
        var result = null;
        enumDictionary[enumName].some(function (enumValue) {
            if (enumValue.id == enumValueId) {
                result = enumValue.name;
                return;
            }
        });

        return result;
    }