【问题标题】:BreezeJS - how do write complex queries?BreezeJS - 如何编写复杂的查询?
【发布时间】:2012-11-30 02:39:40
【问题描述】:

如何使用 BreezeJS + OData 或 WebAPI 编写复杂的查询?我想在 JayData 中使用 Northwind 作为参考数据库是这样的吗?我的问题是我不知道如何表达同时引用数据库的查询(不是与常量相比的字段)以及具有复杂逻辑树(a || (b && c))的查询?

context.Products.filter(function(product) {
   return (product.Unit_Price < product.Category.BudgetPriceLimit) || 
   (product.Category.IsOnSale && product.Supplier.IsFavored)
}).toArray(...)

我的另一个问题是关于 TypeScript + 查询。如何在 BreezeJS 中使用箭头函数进行查询?因此,有一种方法可以代替表达式构建器:

query(Product => Product.Unit_Price < Product.Category.BudgetPriceLimit)

感谢您的帮助,如果这些问题很明显,我们深表歉意。

【问题讨论】:

  • 几周后,我们将发布 Breeze 的 JayData 提供程序。有了这个提供商,您将能够两全其美:从 Breeze Web API 服务器端受益,JayData 通过 JSLQ 和 TypeScript 支持提供客户端体验。
  • BreezeJS 的 JayData 提供程序很好,为什么?
  • 您将能够扩展您的 Web API 代码,使其具有元数据。这就是微风在服务器端所做的(除其他外)。之后,您可以使用 JayData 按照您描述的方式表达查询,您还可以获得对实体和查询的 TypeScript 智能感知支持。您也可以将本地数据存储与相同的 API 一起使用。
  • 我欢迎 JayData 参加聚会。如果 JayData 在他们的 JSLQ 中为 @BigJ.Lee 要求的数据值比较提供语法,我无法从这个回复中判断出来。目前,此类比较不在 OData 规范中 AFAIK。在查询子句中接受函数是我们一直在考虑的事情。如果您认为这很重要,请vote for it in User Voice
  • 从 v 0.84.4 开始,breeze 通过一个 'breeze.d.ts' 文件提供完整的 TypeScript 支持,该文件位于微风网站上,位于微风 zips 中找到 here

标签: typescript breeze jaydata


【解决方案1】:

这篇文章已经过编辑,以纠正我的一个错误,以及从 v 0. 77.1 开始添加到微风中的新功能。

好问题!

Breeze 现在支持跨属性查询表达式(从 v 0.77.1 开始),例如:

var shippedLateQuery = EntityQuery.from("Orders")
                                  .where("requiredDate",">","shippedDate");

第三个参数(上面的“shippedDate”)将被视为属性表达式或文字,具体取决于上下文。一般来说,如果该值可以解释为属性表达式,那么它将被解释为,否则将被视为文字。在大多数情况下,这很有效,但您也可以强制解释。有关详细信息,请参阅 API 文档。

通过 Predicates 完成复杂查询,即 (a || (b && c)),轻轻松松。这里有一些很好的例子:

Query Examples - see the Compound Conditions with Predicates topics

此外,这里的第一个微风教程:Tutorial 还可以让您试用这些功能(请参阅第 5 步)。

我们正在积极关注 Typescript,并计划全面启用它,但我们仍处于早期阶段。

更新:从 v 0.84.4 开始,Breeze 提供完整的 TypeScript 支持。

【讨论】:

  • OData 确实支持这些查询,请参阅odata.org/media/30002/OData%20ABNF.html,在工作示例中搜索 boolCommonExpr:services.odata.org/Northwind/Northwind.svc/…
  • 我研究了查询手册,感谢您的指导。
  • 很抱歉这么说 - 但是为了有一个“和”而编写 3-4 行代码很麻烦,或者至少对我来说不直观。我的应用程序将有大量不同的查询,我的重点是可读性。我有一个查询,其中包含不少于 20 个谓词。构建它几乎需要一个屏幕和大量的打字......
  • 另外有些事情只需要我进行跨属性查询 - 否则我必须向客户端下载太多数据:(但无论如何谢谢。
  • 没问题,你比我更了解你的问题。顺便说一句,感谢 OData 的指针,我们将在今天晚些时候添加对跨属性谓词的支持。
【解决方案2】:

在 Breeze 支持字段到字段比较之前,您可能会考虑在服务器端控制器上编写自定义查询方法,以构建可以进行字段到字段比较的 LINQ 查询。为了给你的客户端更多的灵活性,它可以传递你的控制器方法解释的参数来影响查询构造;使用 withParameters 子句。您可以结合使用 OData 查询子句和 withParameters 子句。

【讨论】:

  • 我是否必须为此手动构建 LINQ 查询?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 2021-09-10
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
相关资源
最近更新 更多