有时我希望在服务器上执行与使用BreezeJS库时在客户端上执行相同的查询。
这是一个简单的例子。想象一下,查询的结果在客户端上受限于使用skip()和take()进行分页。 “导出”功能将允许下载未分页的数据集;即:没有“接受/跳过”限制。
现在在一个简单的“Select * from TableName”类型的查询中,这是微不足道的,但是如果breeze Predicate很复杂并且动态创建(排除使用着名的服务器端SQL View),那该怎么办呢。
理想情况下,我想知道Breeze.js .NET客户端用来将Predicate转换为Linq Where子句的源代码。
这不是我发布过的最好的问题,所以如果您愿意提供帮助,需要更多信息,请发表评论,我很乐意发布示例或更多详情。
答案 0 :(得分:3)
查看Web API的[BreezeController]
属性。您将看到它如何组成包含客户端查询参数的LINQ表达式。
但是,我怀疑为了您的目的,以解析的形式提供客户端查询信息会更有用,这样您就可以设置适当的服务器端数据观察器并使用它来过滤客户感兴趣的更改。 Web API在可选参数ODataQueryOptions<T> options
中为您提供此信息,其中T
与IQueryable<T>
中的类型相同。
理论上,您可以将查询发送到“资源”,该资源实际上只是一种注册感兴趣的更改的方法
例如,假设您有热门产品的查询
var hotStuff = breeze.EntityQuery.from('Products').where('IsHot', 'eq', 'true'); manager.executeQuery(hotStuff).then(success, fail);
您通过定位其他资源
稍微修改该查询var hotStuffWatcher = breeze.EntityQuery.from('ProductsWatch').where('IsHot', 'eq', 'true'); manager.executeQuery(hotStuffWatcher); // you don't care what or whether it returns
在Web API方面,该方法是
[HttpGet] [BreezeQueryable] // Must tell breeze to treat this method as if it returned IQueryable<T> public RegistrationToken ProductsWatch(ODataQueryOptions<Product> options) { var registrationToken = Watch<Product>(options); return registrationToken; // perhaps useful when client wants to cancel the watch }
请理解我大部分都在猜测为你的研究提供一条途径。