如何使用 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);
我正在开发一个在后端使用 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);