5

我有一个包含非常大表的数据库(其中一些可能有超过 1,000,000 条记录),并且该数据库的每个用户都应该看到其中的一些数据,因此我们有多个 TVF(表值函数),它们获取用户 ID 并选择那些该用户可见的表的记录(此操作需要多个SELECT语句,我认为调用 TVF 比在代码中实现它要好得多)。在向我的客户发布的程序的第一个版本中,我有一个具有多个类型属性的类IQueryable,它使用 LinqToSql 实现并且效果很好。现在我有一个客户想要使用我的程序集来编写 WCF 数据服务,所以我必须编写一个派生自DbContext(使用 EF)的类,该类可以在指定的服务中使用。我的问题是:

  • DbContext自动公开DbSet其中定义的所有属性,因此每个具有最低访问级别的用户都可以查看表的整个数据(当然客户端应用程序会限制数据,但客户端可以直接访问数据,甚至可以使用将这些数据导入 Excel 或 Access数据)

  • 我有多个类型的公共属性,IQueryable但它们不会出现在 WCF 数据服务公开的数据列表中。

为了解决这个问题,我认为最完整的解决方案是能够将 TVF 称为表并从中创建一个集合。但是我不知道该怎么做?!

注意 对数据库的任何更改都需要一些日志记录,因此我有存储过程来执行这些更改,因此我只需要对我的 WCF 数据服务的只读访问权限,并且我不希望包含在服务

4

3 回答 3

2

我认为您可以通过使用自定义数据服务提供程序来定义 WCF 服务的形状来获得所需的功能。这可能会变得非常复杂,但是由于您已经有一堆 IQueryables,您可能可以使用Reflection Provider,文档说:

反射提供程序在返回实现 IQueryable 接口的类型的类中公开数据。WCF 数据服务使用反射来推断这些类的数据模型,并且可以将针对资源的基于地址的查询转换为针对公开的 IQueryable 类型的基于语言集成查询 (LINQ) 的查询。

该文档链接到使用反射提供程序的“如何”。基本上,您只需创建一个具有 IQueryable 属性的伪上下文类,向您的数据对象添加一些属性,并将您的 DataService 指向您的伪上下文类型。(如果您使用的是数据库/模型优先 EF,您可能需要创建实体的部分以添加属性或更新 T4 模板。)

于 2013-08-17T11:38:13.140 回答
0

为什么不使用 UserID 作为参数创建一个返回记录集的参数化存储过程 (SP)?实体框架可以使用它。

您可以在 SP 中调用您的 TVF,或者只是音译 SP 中的 TVF 内容。

如果您需要添加/删除/更新功能,如果您的查询不可更新,您可能还需要这些功能的 SP。

于 2013-08-16T00:18:39.623 回答
0

DbContext 自动公开其中定义的所有 DbSet 属性

我建议,您在数据库中创建视图或使用 Linq2Sql 模板。

  1. 如果您制作视图,模型设计器会制作正确的 DataTable。
  2. 如果您使用 linq2sql 模板,
    您可以制作只有您想向其他人展示的属性的数据模型。
    (删除linq2sql上的connectioninfomation并用connctionString分配后,就是如何使用了。)

我有多个 IQueryable 类型的公共属性,但它们不会出现在 WCF 数据服务公开的数据列表中。

制作模型并使用 linq 和方法 ExcuteJsonAll。
如果有人收到 JSON 文件,就会有人提供它。

如何将模型制作成存储过程。

  1. 在数据库中选择 SP。

  2. 从数据库更新您的模型

    在这里,你带来了 SP。

  3. 在 edmx 或模型视图中,您使用 SP 制作函数。

  4. 在创建函数的过程中,您可以使 sp 的 DataSet 相关返回值。

于 2013-08-16T01:45:25.737 回答