6

我正在将 Breezejs 用于客户端 JavaScript。我不确定在使用应用了过滤器(where 子句)的 Breezejs(使用 IQueryable 的服务器端)时如何获取查询总数。

4

4 回答 4

5

从 v 0.75.1 开始,我们向 EntityQuery 添加了一个新的“inlineCount”方法。有关详细信息,请参阅微风 API 文档。希望这将提供您所需要的。

于 2012-12-07T20:53:09.947 回答
2

我们对 Ward 的方案做了一点改动,因为 Enumerable.Count 会从 db 中加载所有记录,而不仅仅是 count(我们看了 sql profiler 后才意识到这一点)。

首先我们为 IQueryable.Count 扩展方法创建一个包装器(因为我们不能通过反射调用扩展方法)。

public static class QueryWrapper {
    public static int Count<T>(IQueryable<T> query) where T: class {
        return query.Count();
    }
}

我们改变了

if (actionExecutedContext.Request.RequestUri.Query.Contains("$inlinecount")) {
    if (dQuery is IQueryable) {
        inlineCount = Enumerable.Count(dQuery);
    }
}

使用此代码,

if (actionExecutedContext.Request.RequestUri.Query.Contains("$inlinecount")) {
    if (dQuery is IQueryable) {
        var method = typeof(QueryWrapper).GetMethod("Count");
        var genericMethod = method.MakeGenericMethod(elementType);
        inlineCount = (int)genericMethod.Invoke(null, new object[] { dQuery });
    }
}

在此更改之后,实体框架仅获得计数,而不是所有记录。

希望这可以帮助。

祝你今天过得愉快。

于 2012-12-06T14:41:22.913 回答
1

更新: $inlineCount 从 v.0.75.1 开始在微风中,使这个答案过时了。

因此,我删除了我的回答,其中描述了一种解决方法(Umut Özel 在他的回答中改进了一种解决方法)。新功能是由这个 SO 问题和您的所有贡献驱动的。谢谢你。

于 2012-12-02T19:48:33.467 回答
1

支持 $inlinecount 查询目前正在审核中 - 请投票支持。

于 2012-12-01T23:20:54.707 回答