【问题标题】:Generate queries on the client side在客户端生成查询
【发布时间】:2014-02-25 16:05:40
【问题描述】:

我希望能够在客户端生成查询,然后将它们发送到服务器。为了仍然具有安全性,这是我的方法:

  1. 每个客户都与一个帐户相关联。因此,客户端必须向服务器发送帐户 ID 和查询。

  2. 然后服务器将接收帐户 ID 和查询。 服务器随后将对与该帐户相关的所有表和行进行连接

  3. 一旦服务器将与该帐户相关的所有记录作为连接语句。然后它将执行客户端发送的查询,并将针对连接而不是整个数据库执行该查询。

所以我的问题是如何将 linq 查询发送到服务器?例如,我希望客户端发送:

//           Id of Account                  QUERY
object[]{ "AfKX-3451-X4hT-...", myContext.Customers.Where(x=>x.Age>18) }

第二个参数是 IQueryable 类型,因此我不能序列化它:(

如果恶意用户反编译客户端应用程序并更改查询,那么他只会影响他的帐户,而不是整个数据库。

【问题讨论】:

  • 您是否要在本地拥有 EF 模型的副本?
  • 这听起来像是个坏主意。不仅因为 anyone 可以反编译应用程序,而且主要是因为它将所有业务逻辑拉入客户端。当客户端只能获取或保存细粒度数据时,几乎没有任何服务器/服务端业务逻辑。但无论如何,看起来 OData 将是实现这一目标的更好选择(取决于您正在谈论的应用程序类型)。此外,如果这是关于多租户的,在 EF 中有更好的方法来处理它(例如,每个租户的模式)。

标签: c# sql linq ado.net


【解决方案1】:

我建议公开一个 OData 端点并使用 Linq 来查询它。
更多信息:http://msdn.microsoft.com/en-us/library/ee622463.aspx

【讨论】:

  • 我认为 .net odata 实施目前还没有准备好,但它的功能强大。你的选择
【解决方案2】:

您可以通过表达式树序列化程序库对第二个参数进行序列化,或者您可以在实体框架的源代码中找到序列化程序。使用用户 ID 和序列化查询调用 web 服务,并添加一些条件来查询,例如 query = query.Where(f=>f.UserId==userId) 并执行它。

Expression Tree Serializer

您必须为所有搜索结果返回一个已知类型,例如数据表、数据行...您可以实现自己的。

此外,您还可以使用 3rd 方组件来执行此操作,例如 Telerik 的过滤器控件。

【讨论】:

    猜你喜欢
    • 2020-08-31
    • 2020-10-25
    • 2015-11-21
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2022-10-17
    • 2018-05-23
    • 2012-06-14
    相关资源
    最近更新 更多