如何使用 BreezeJs 中的组功能过滤记录

How to filter records using group functionality in BreezeJs

我正在开发一个在后端使用 breezejs 和 Entity Framework6 的客户端应用程序。我有这样的声明:

        var country = 'Mexico';

        var customers = EntityQuery.from('customers')
            .where('country', '==', country) 
            .expand('order')

我要用每个客户下的订单可能有几百个。出于性能目的,我只想检索每个客户的最新订单。这将基于订单的创建日期。在 SQL 中,我可以这样写:

    SELECT c.customerId, companyName, ContactName, City, Country, max(o.OrderDate) as LatestOrder FROM Customers c
        inner join Orders o on c.CustomerID = o.CustomerID
        group by c.customerId, companyName, ContactName, City,  Country

如果这是针对 northwind 数据库的 运行,则仅为每个客户返回最近的订单行。

我如何在 breeze 中编写类似的查询,以便它 运行 在服务器端,因此 returns 客户端的数据更少。我知道我可以在客户端处理这一切,但是在客户端可以 运行 的查询成功方法中写一些 javascript - 但这不是这里的目标。

谢谢

对于这种情况,您应该创建一个特殊的端点方法来执行您的查询。
然后您可以使用 Entity Framework 查询来执行您想要的操作,使用 LINQ 语法。 这里有两个 Web API 示例:

[HttpGet]
public IQueryable<Object> CustomersLatestOrderEntities()
{
    // IQueryable<Object> containing Customer and Order entity
    var entities = ContextProvider.Context.Customers.Select(c => new { Customer = c, LatestOrder = c.Orders.OrderByDescending(o => o.OrderDate).FirstOrDefault() });
    return entities;
}

[HttpGet]
public IQueryable<Object> CustomersLatestOrderProjections()
{
    // IQueryable<Object> containing Customer and Order entity
    var entities = ContextProvider.Context.Customers.Select(c => new { Customer = c, LatestOrder = c.Orders.OrderByDescending(o => o.OrderDate).FirstOrDefault() });

    // IQueryable<Object> containing just data fields, no entities
    var projections = entities.Select(e => new { e.Customer.CustomerID, e.Customer.ContactName, e.LatestOrder.OrderDate });
    return projections;
}

请注意,您可以在此处进行选择。您可以 return 实际实体,也可以 return 只是一些数据字段。哪个适合您取决于您​​将如何在客户端上使用它们。如果它们只是为了展示在 non-editable 列表,你可以只 return 普通数据(CustomersLatestOrderProjections 以上)。如果他们有可能 进行编辑,然后 return object 包含实体 (CustomersLatestOrderEntities)。 Breeze 将合并实体 进入其缓存,即使它们包含在此匿名 object.

无论哪种方式,因为它 returns IQueryable,您可以使用来自客户端的 Breeze 过滤语法来进一步限定查询。

var projectionQuery = breeze.EntityQuery.from("CustomersLatestOrderProjections")
    .skip(20)
    .take(10);

var entityQuery = breeze.EntityQuery.from("CustomersLatestOrderEntities")
    .where('customer.countryName', 'startsWith', 'C');
    .take(10);