gpt4 book ai didi

c# - 从 Entity Framework 中的表值函数创建集合

转载 作者:太空狗 更新时间:2023-10-29 23:39:26 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

我认为您可以使用 customized data service provider 获得所需的功能定义 WCF 服务的形状。这可能会变得相当复杂,但由于您已经有了一堆 IQueryable,您可能可以使用 Reflection Provider ,文档说:

The reflection provider exposes data in classes that return types that implement the IQueryable interface. WCF Data Services uses reflection to infer a data model for these classes and can translate address-based queries against resources into language integrated query (LINQ)-based queries against the exposed IQueryable types.

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

关于c# - 从 Entity Framework 中的表值函数创建集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18195675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com