是否有像Breeze这样的java脚本库允许查询IQueryable方法而不是属性?

时间:2013-12-23 18:39:50

标签: javascript entity-framework domain-driven-design breeze cqrs

我的目标是建立一个用于编写的域模型(因此没有暴露给客户端的可写实体)和用于阅读的查询(即仅用于阅读的专用实体模型)。

在观看与Breeze相关的多重培训时,我找不到任何需要的使用示例。显示的是向客户端java脚本中的实体放置查询。但除了3个案例之外,我真的没有理由这样做: 1.频繁:响应用户点击进行寻呼 2.频繁:响应用户排序选择进行排序 3.罕见:基于最终用户构建的动态过滤器进行过滤 - 很少见,因为现在您宁愿使用单个搜索框来匹配任何列 - 没有人会打扰点击以创建复杂的布尔表达式。

这三种情况都在为客户端的可查询性而烦恼。查询任何其他条件(例如“超过100美元的订单”)我认为是业务逻辑,我不想把它放到java脚本中,因为我想让客户端尽可能地保持瘦弱和愚蠢(你真的想要吗?)判断100美元是客户端的净额还是总额?)。我更喜欢在服务器端对实体模型使用强类型LINQ查询。并且存在限制:返回IQueryable的控制器方法将不接受参数。因此,无法编写参数化查询,其中参数(如“订单值阈值”)由服务器在内部处理,并且仅以服务器已知的方式处理。

问题:是否有一个Java脚本库可以给我这个功能?我真正需要的是只是一个流畅的Java脚本查询API,就像在Breeze中一样 - 在服务器端自动转换为Lambda并应用于我的IQueryable甚至更好 - 我可以自己注入我的服务器端的LINQ查询。

1 个答案:

答案 0 :(得分:1)

我不完全确定我理解你的问题,但我认为你错过了Breeze的一些功能。

Breeze将允许您公开将在服务器上的现有任意IQueryable之上应用的任何客户端查询...并且您还可以传入与合并查询一致的参数。例如:

在服务器上,您可以使用如下所示的端点:

[HttpGet]
public IQueryable<Employee> EmployeesFilteredByCountryAndBirthdate(DateTime birthDate, string country) {
  return ContextProvider.Context.Employees.Where(emp => emp.BirthDate >= birthDate && emp.Country == country);
}

可以从客户端查询:

var q = EntityQuery.from("EmployeesFilteredByCountryAndBirthdate")
        .withParameters({ birthDate: "1/1/1960", country: "USA" });

myEntityManager.executeQuery(q).then(function (data) {
  ... process the results.
}

您甚至可以添加对查询的进一步过滤,以便它代表服务器端逻辑和客户端过滤器的应用程序。类似的东西:

var q = EntityQuery.from("EmployeesFilteredByCountryAndBirthdate")
        .withParameters({ birthDate: "1/1/1960", country: "USA" })
        .where("lastName", "startsWith", "S");

通常,我喜欢将客户端查询视为“进一步”限制您在服务器上定义的任何端点返回的数据的一种方式。无论是出于安全性还是业务逻辑合并目的,服务器查询都可以是精确且集中的。客户端查询只允许您进一步限制返回的有效负载到对您的用例有用的任何子集。

Breeze zip中的Breeze DocCode示例包含许多这样的有用示例。