我正在为以下情况寻找可能的解决方案:
理想情况下,我希望客户端在客户端针对代理对象模型编写一个 LINQ 查询,序列化表达式树,通过网络发送序列化查询,确保客户端只执行“读取”操作,然后返回一个动态结果集。
不幸的是,序列化/反序列化表达式树并确保只读操作(禁止恶意查询)似乎并不容易。
一个想法是使用 LINQ to SQL 提供程序来序列化查询,然后在服务器端使用 Entity SQL 来反序列化查询并在我的对象模型中运行它。
无论如何,我想知道在构建这项服务时我还有哪些其他优雅的选择。
谢谢,
汤姆
最佳答案
您可以考虑实现 OData客户端访问的端点。服务器和客户端库已经存在以提供以下功能:
现在,我不确定这个解决方案是否能巧妙地提供对表达式树的序列化/反序列化;由于您正在处理内存中的对象,因此您可能需要做一些手动工作才能实现这一点。
我见过的大多数使用 OData 的例子都是使用数据库作为后端。但是,您可以为您的内存数据构建一个自定义 OData 提供程序,然后仍然利用该协议(protocol)的通用协议(protocol)和丰富的客户端库支持。如果序列化/反序列化的全部目的是能够通过 HTTP 传输数据,OData 已经为您解决了这个问题。
有关 OData 端点的快速示例,请访问 Stack Overflow's implementation of OData .他们已经实现了一个解决方案,允许您编写一个直接的 SQL 查询来从 StackOverflow 获取数据。虽然我无法找到他们针对 OData 服务用于测试查询的确切查询字符串,但我确实注意到,当我通过 Fiddler 检查响应时,结果以 JSON 序列化返回。这是一个很好的例子,可以看到 OData 的强大功能。
关于.net - 动态远程查询(例如可序列化的 LINQ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3551258/