在实体框架中从表值函数创建集合

本文关键字:函数 创建 集合 实体 框架 | 更新日期: 2023-09-27 18:27:19

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

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

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

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

注意对数据库的任何更改都需要一些日志记录,所以我有存储过程来进行这些更改,所以我只需要对WCF数据服务的只读访问,并且我不希望默认集包含在服务中发布的表的所有记录

在实体框架中从表值函数创建集合

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

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

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

为什么不创建一个以UserID为参数的返回参数化存储过程(SP)的记录集?实体框架可以处理此问题。

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

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

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

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

  1. 如果您制作视图,则模型设计器会制作正确的DataTable
  2. 如果您使用linq2sql模板,
    您可以创建只有要向其他人显示的属性
    (在删除linq2sql上的connectioninfomation并使用conctionString进行分配后如何使用。)

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

制作模型并使用linq和方法ExcuteJsonAll
如果有人收到JSON文件,则有人会使其可用。

如何将模型制作为存储过程

  1. 在数据库中选择SP。

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

    给,你带上SP。

  3. 在edmx或模型视图中,使用SP.生成函数

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