breeze 1.4.5和EF 6.0.1上的inlineCount在使用select的查询中未定义

breeze 1.4.5和EF 6.0.1上的inlineCount在使用select的查询中未定义,breeze,Breeze,我有许多分页查询,它们在Breeze1.4.5(遗留)、EF5和WebApi中正常工作 然而,作为一个将长期维持的项目,由于其复杂性,即使是不可能应用最新的技术 因此,该项目已更新为使用EF6、ASP MVC 5和WebApi 2,包括以下步骤和Breeze文档 更新后,除了需要在ApiController方法中添加[BreezeQueryable(MaxExpansionDepth=[n])]或[BreezeQueryable(MaxNodeCount=[n])]属性外,一切正常 现在最大的问

我有许多分页查询,它们在Breeze1.4.5(遗留)、EF5和WebApi中正常工作

然而,作为一个将长期维持的项目,由于其复杂性,即使是不可能应用最新的技术

因此,该项目已更新为使用EF6、ASP MVC 5和WebApi 2,包括以下步骤和Breeze文档

更新后,除了需要在ApiController方法中添加
[BreezeQueryable(MaxExpansionDepth=[n])]
[BreezeQueryable(MaxNodeCount=[n])]
属性外,一切正常

现在最大的问题是“data.inlineCount”的返回总是“未定义”,它完全破坏了分页逻辑

请注意,除了“HttpGet”(不是大小写)之外,没有任何属性的方法中也会出现此问题,并且在客户端使用select的查询中,如果没有select,则一切正常

有一件事没有提到,在使用Fiddler和Chrome开发工具分析响应时,“InlineCount”的片段不在那里,只有结果数组

在查询探查器中,SQL是正确的,并且包含用于计数的元素

使用TempHire示例,然后仅用于“资源管理”屏幕上的测试,更改“all”函数place.inlineCount(true)上的repository.js:

结果一切顺利:“InlineCount:9” 现在放置一个选择:

this.all = function () {
    var query = breeze.EntityQuery
        .from(resourceName)
        .select('Address1, Address2, City, FullName, Id, PhoneNumber, State, Zipcode')
        .inlineCount(true);
    return executeQuery(query);
};
我们不再只计算结果数组的$id、$type和InlineCount。 此行为在以前的版本中不存在

遵循正在使用的大型通用查询:

function getOrdensServico(observable, criteria, pagingInfo) {
        var query = entityQuery.from(info.ordemServico.entitySet)
            .select('idOrdemServico, numeroOrdemServico, dataOrdermServico, situacaoOrdemServico, conta, departamento, usuario')
            .orderBy(info.ordemServico.orderBy);

        if (criteria) {
            criteria = criteria();
            if (criteria.numero()) {
                query = query.where('numeroOrdemServico', '==', criteria.numero());
            }
            if (criteria.situacao()) {
                query = query.where('situacaoOrdemServico', '==', criteria.situacao());
            }

            if (criteria.nomeDepartamento()) {
                query = query.where('departamento.nomeDepartamento', 'contains', criteria.nomeDepartamento());
            }
            if (criteria.dataCriadaEntre() > 0) {
                var pred = utl.createBetweenPredicateFromDays("dataOrdermServico", criteria.dataCriadaDe, criteria.dataCriadaEntre);
                query = query.where(pred);
            }
        }

        if (pagingInfo) {
            var currentPage = ko.utils.unwrapObservable(pagingInfo.currentPage),
                pageSize = ko.utils.unwrapObservable(pagingInfo.pageSize);
            query = query.skip(currentPage * pageSize).take(pageSize).inlineCount(true);
        }

        return datacontext.manager.executeQuery(query.toType(info.ordemServico.entityName))
                          .then(querySucceeded)
                          .fail(queryFailed);

        function querySucceeded(data) {
            utl.safeSetCollection(observable, data.results);
            if (pagingInfo) {
                pagingInfo.inlineCount(data.inlineCount || data.results.length);
            }
            logSucceeded('Ordens de serviço', data);
        }
    }

在EF5上也有类似的问题,如下所述:


为用于中断inlineCount的方法添加属性。过了一段时间,我发现对于那些需要分页的查询,它通常只是表示实体的最小信息,所以我重写了这些查询,只包含部分数据,并自己写下了inlineCount,它工作得很好。

这在最新版本中得到了修复:Breeze 1.4.7,现在可用

我以前也遇到过这个问题,并使用属性'BreezeQueryable'而不是'Queryable'解决了这个问题。然而,事实并非如此,即使除了“HttpGet”之外没有其他属性,并且仅使用Breeze 1.4.5 WebApi 2、EF 6,而不是在Breeze 1.4.5(过时),WebApi和EF 5在同一项目上正常工作,也会出现问题。目前无法重新设置此属性。我们所有使用inlineCount和EF6的测试用例似乎都工作正常。但是将继续查找。您是否可以发布一个指定的“简单”查询,该查询在客户端查询逻辑和服务器端点逻辑中都失败?包括获取上述行为的方法。好的,谢谢。这是一种倒退。它将在下一版本中修复,在周末或周一发布。感谢收听,确定后在这里发布,以便我可以标记为已解决。
function getOrdensServico(observable, criteria, pagingInfo) {
        var query = entityQuery.from(info.ordemServico.entitySet)
            .select('idOrdemServico, numeroOrdemServico, dataOrdermServico, situacaoOrdemServico, conta, departamento, usuario')
            .orderBy(info.ordemServico.orderBy);

        if (criteria) {
            criteria = criteria();
            if (criteria.numero()) {
                query = query.where('numeroOrdemServico', '==', criteria.numero());
            }
            if (criteria.situacao()) {
                query = query.where('situacaoOrdemServico', '==', criteria.situacao());
            }

            if (criteria.nomeDepartamento()) {
                query = query.where('departamento.nomeDepartamento', 'contains', criteria.nomeDepartamento());
            }
            if (criteria.dataCriadaEntre() > 0) {
                var pred = utl.createBetweenPredicateFromDays("dataOrdermServico", criteria.dataCriadaDe, criteria.dataCriadaEntre);
                query = query.where(pred);
            }
        }

        if (pagingInfo) {
            var currentPage = ko.utils.unwrapObservable(pagingInfo.currentPage),
                pageSize = ko.utils.unwrapObservable(pagingInfo.pageSize);
            query = query.skip(currentPage * pageSize).take(pageSize).inlineCount(true);
        }

        return datacontext.manager.executeQuery(query.toType(info.ordemServico.entityName))
                          .then(querySucceeded)
                          .fail(queryFailed);

        function querySucceeded(data) {
            utl.safeSetCollection(observable, data.results);
            if (pagingInfo) {
                pagingInfo.inlineCount(data.inlineCount || data.results.length);
            }
            logSucceeded('Ordens de serviço', data);
        }
    }