1

我很好奇是否有人对为什么将 .Select 添加到轻量级查询并仅返回单个列会导致我的日期字段以不同方式解析的原因有任何见解?我的想法是两个查询都应该返回相同的数据/对我的日期字段使用相同的元数据。

例如

Retrieving the entity that includes the date:
    function getACase()
    {
        var returnPromise = Q.defer();
       var caseQuery = breeze.EntityQuery
           .from("case")
           .where("pkCaseID", "eq", 1013)
        return Q.delay(0)
            .then(function()
            {
                return manager.executeQuery(caseQuery)
                    .then (function(data)
                    {
                    returnPromise.resolve();
                    return data.results;
                    })
                    .fail(function(){$log.error("CaseData Query Failed")});
            }) ;
        return returnPromise.promise();
    }

CourtDate 列被转换为日期:(来自数据库的实际日期是 1950 年 1 月 1 日)

在此处输入图像描述

Retrieving just the date column from the database:
   function retrieveCourtDate ()
    {
        var returnPromise = Q.defer();
        var query = breeze.EntityQuery
            .from("case")
            .where ("pkCaseID", "eq", 1013)
            .select("CourtDate");
        return Q.delay(0)
            .then(function()
            {
                return manager.executeQuery(query)
                    .then (function(data)
                {
                     returnPromise.resolve();
                    return data.results;
                })
                    .fail(function(){$log.error("Date Query Failed")});
            });
        return returnPromise.promise();
    }

CourtDate 未转换:

在此处输入图像描述

在屏幕上显示为:在此处输入图像描述

4

1 回答 1

2

好的,这不是错误,但很痛苦。基本上,当 Breeze 执行返回任何已知entityType的查询时,我们有元数据来确定从服务器返回的 json 中的每个属性的dataType是什么。这就是让我们能够获取像“1996-07-13T00:00:00.000Z”这样的 json ISO8601 序列化日期字符串并将其转换为 javascript 日期对象的原因:Fri Jul 12 17:00:00 PDT 1996

问题是,当您使用 Breeze“选择”语句时,从服务器返回的结果是一个匿名对象,而 Breeze 不知道该对象上任何属性的数据类型。Breeze确实会遍历返回对象的所有属性以确定是否有任何嵌入实体,但它无法确定名为“CourtDate”的属性实际上是日期数据类型(我们可以猜测,但还有其他问题接着就,随即)。

对于包含日期的匿名对象,有一个解决方法,因为您知道日期的属性,您可以调用 Breeze 的DataType.parseDateFromServer方法

  data.results.forEach(function(anon) {
      anon.CourtDate = breeze.DataType.parseDateFromServer(anon.CourtDate);
  }
于 2013-08-17T19:13:39.737 回答