c# - 使用 SQL 查询 Web 服务

标签 c# sql linq web-services

最近,当我考虑将面向服务的架构与出色的 UI 相结合时,我感到有点震惊,该 UI 在查询数据时利用 SQL 来优化性能。

例如,ASP.NET 的 DevExpress GridView 非常酷,它将所有过滤、排序和分页逻辑委托(delegate)给数据库服务器。但这假定数据是从支持 SQL 的数据库服务器中检索的。

如果我想在数据库层和UI层之间引入一个web服务层,让UI使用web服务查询数据呢?

  • 如何设计 Web 服务和 UI,以便我可以通过 Web 服务将来自 UI 的过滤请求传递到数据库?
  • 我是否需要提供 List QueryData(string sqlQuery) 样式的 Web 服务并且必须自己解析 SQL 字符串以保证安全/访问限制?
  • 或者是否有任何好的框架或设计指南可以减轻我的负担?

这一定是一个很普遍的问题,相信已经解决得比较充分了吧?

我主要对基于 .NET/C# 或兼容的解决方案感兴趣。

编辑:我找到了 OData 和 Microsoft WCF 数据服务。如果我做对了,基于 OData 的应用程序可能如下所示:

  1. User ---/Give me Page 1 (records 1..10)/---> ASP.NET Server Control(当然,通过 HTTP)
  2. ASP.NET 服务器控件 ---/LINQ 查询/---> 数据服务客户端
  3. 数据服务客户端 ---/OData查询/---> WCF数据服务
  4. WCF 数据服务 ---/LINQ 查询/---> Entity Framework
  5. Entity Framework ---/SQL查询/---> 数据库

如果我做对了,我的 DevExpress 服务器控件应该能够通过所有这些层将过滤请求(例如只给我前 10 个)委托(delegate)给数据库,然后应用其索引等以执行该操作查询。

是这样吗?

编辑: 很高兴看到这个线程活跃起来 :-) 很难决定接受什么答案,因为对我来说所有答案都一样好...

最佳答案

非常有趣的问题!我认为没有正确或错误的答案,但我认为您可以建立一些架构原则。

首先,“面向服务的架构”是一种架构风格,需要您公开业务服务以供其他应用程序使用。运行数据库查询不是一项服务——至少在我看来是这样。事实上,提供 Web 服务来执行任意 SQL 可能是一种反模式——你会绕过大多数数据库服务器提供的安全模型,你无法控制查询——编写语法正确的“select”相对容易使您的数据库瘫痪的查询(笛卡尔连接是我的最爱),并且 Web 服务协议(protocol)的开销会使这种方法比仅通过正常访问路由(LINQ 或其他)查​​询数据库慢几倍。

那么,假设您接受该观点 - 问题的解决方案是什么?

首先,如果您想提高使用 DevExpress 网格的效率,您可能应该按照 DevExpress 希望您工作的方式工作——如果这意味着直接查询数据库,那是迄今为止最好的方式。如果您想转向 SOA,而 DevExpress 网格不支持它,那么是时候寻找新的网格控件了,而不是将整个企业架构裁剪成一个相对较小的组件。

其次 - 在结构上,您应该在哪里进行排序、过滤等?这在 SQL 中是一个简单的概念,但在尝试将其转换为 Web 服务规范时却令人不快——您很快就会得到一个难以理解的方法签名(“getAccountDataForUser(userID, bool sortByDate, bool sortByValue, bool filterZeros, bool filterTransfers)” ). 另一方面,在客户端执行过滤和排序是困惑和缓慢的。

我的建议是查看 Specification Pattern - 这允许您拥有干净的方法签名,但以一致的方式指定所需的排序和排序。

关于c# - 使用 SQL 查询 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5468910/

相关文章:

C# 多线程控制台应用程序 - 控制台在线程完成之前退出

c# - 攻击/跟随我的玩家

php - 仅当有多个记录时才选择记录

c# - Entity Framework 在判别器上做案例

c# - SingleOrDefault 返回 null 时的 LINQ 新实例

c# - 为什么我从 GroupJoin 中得到如此奇怪的结果?

c# - 上下文菜单

sql - 创建椭圆地理表示

sql - Oracle REGEXP_REPLACE 开头的数字和空格

c# - 使用 Linq 选择 top1