0

有时我希望在使用 BreezeJS 库时在服务器上执行与在客户端上执行相同的查询。

这是一个简单的例子。想象一下,查询的结果在客户端上被限制为使用 skip() 和 take() 进行分页。“导出”功能将允许下载未分页的数据集;即:没有“采取/跳过”限制。

现在在一个简单的“Select * from TableName”类型的查询中,这是微不足道的,但如果微风谓词很复杂,并且是动态创建的(排除使用众所周知的服务器端 SQL 视图)怎么办。

理想情况下,我想知道 Breeze.js .NET 客户端用于将 Predicate 转换为 Linq Where 子句的源代码。


这不是我发布过的最好的问题,因此,如果您愿意提供帮助并需要更多信息,请发表评论,我很乐意发布示例或更多详细信息。

4

1 回答 1

3

查看[BreezeController]Web API 的属性。您将在那里看到它如何组成一个包含客户端查询参数的 LINQ 表达式。

但是,我怀疑出于您的目的,将客户端查询信息以解析的形式保存会更有用,这样您就可以设置适当的服务器端数据观察程序并使用它来过滤客户端感兴趣的更改。Web API 在可选参数中为您提供此信息,ODataQueryOptions<T> options其中T的类型与IQueryable<T>.

从理论上讲,您可以将查询发送到“资源”,该“资源”实际上只是一种注册感兴趣更改的方法

例如,假设您查询热销产品

var hotStuff = blink.EntityQuery.from('Products').where('IsHot', 'eq', 'true');
manager.executeQuery(hotStuff).then(成功,失败);

您通过定位不同的资源稍微修改该查询

var hotStuffWatcher = blink.EntityQuery.from('ProductsWatch').where('IsHot', 'eq', 'true');
manager.executeQuery(hotStuffWatcher); // 你不在乎它返回什么或是否返回

在 Web API 方面,该方法是

[HttpGet]
[BreezeQueryable] // 必须告诉微风将此方法视为返回 IQueryable<T>
公共 RegistrationToken ProductsWatch(ODataQueryOptions<Product> 选项)
{
    var registrationToken = Watch<产品>(选项);
    返回注册令牌;// 当客户端想要取消监视时可能有用
}

请理解,我主要是推测为您提供研究的途径。

于 2013-08-23T00:49:30.510 回答