【发布时间】:2016-06-08 22:21:18
【问题描述】:
我有一个 C# OData 端点,我需要评估与 OData 查询一起提交的过滤器,以确定是否需要添加其他过滤器来限制返回给用户的结果。
我的示例模型很简单:
学生 -> 图书目录 -> 图书 (所有实体都有一个 CampusId 属性分配给它们。)
当属于 Campus #5 的用户执行以下查询时: "学生 $select=Id,Name,CampusId" 它应该转换为: "Students$select=Id,Name,CampusId&$filter=CampusId eq 5"
我可以通过简单的查询来做到这一点,只需将过滤器添加为字符串。
我真正想做的是: 1) 确定选择和扩展的实体 2) 确定这些实体中的任何一个是否具有 CampusId 属性 3) 将必要的过滤器值添加到 Uri 中,以便将每个选定和/或扩展实体的查询过滤到该 Campus
我正在尝试使用 Microsoft.OData.Core.UriParser.ODataUriParser 来解析过滤器值,然后创建一个新的 Uri。
例如:
var parser = new Microsoft.OData.Core.UriParser.ODataUriParser(edmModel, new Uri(serviceRootPath), originalUri);
var filter = parser.ParseFilter();
使用上面的代码 sn-p,您可以获得“过滤器”变量,以提供一种 Microsoft.OData.Core.UriParser.Semantic.FilterClause 类型,可用于检查当前过滤器值在 OData 查询 Uri 中。
有谁知道如何编辑 FilterClause 中的值以便能够向 Uri 添加新的过滤器值?
我没有找到很多关于如何编辑 FilterClause 以生成具有新过滤器值的更新 Uri 的示例。
【问题讨论】:
-
我在这里有一个答案来更改控制器中的过滤器值:stackoverflow.com/questions/37339114/…
-
谢谢,但这无济于事。现实情况是,您提到的该响应中的答案仅在您已经知道 OData Uri 字符串的结构时才有效。实际上,过滤器值可以包括各种其他设置(startsWith、Contains 等),因此简单的字符串替换不会可靠地工作。正确的解决方案应该允许我们检查现有的过滤器表达式树并附加到它(如果需要),而不会干扰它已经包含的任何现有过滤器值。
-
对于它的价值,我想我在这里问了一个几乎相同的问题:stackoverflow.com/questions/33126251/… 还没有一个很好的答案,但它可能会给你一些关于这个问题的更好的背景信息.