我有一个包含非常大的表的数据库(其中一些可能有超过1,000,000条记录),并且该数据库的每个用户都应该看到一些这样的数据,因此我们有多个获得用户ID的TVF(表值函数)并选择该用户可见的表的记录(此操作需要多个SELECT
语句,我认为调用TVF远比在代码中实现它好得多。
在我的客户端的程序的第一个版本中,我有一个类具有类型IQueryable
的多个属性,使用LinqToSql实现,它工作得很好。
现在我有一个客户端想要使用我的程序集来编写WCF数据服务,所以我必须编写一个派生自DbContext
(使用EF)的类,可以在指定的服务中使用。
我的问题是:
DbContext
会自动公开其中定义的所有DbSet
属性,因此每个访问级别最低的用户都可以看到该表的整个数据(当然客户端应用会限制数据,但是客户端可以直接访问数据,甚至可以使用OData将这些数据导入Excel或Access
我有多个IQueryable
类型的公共属性,但它们不会出现在WCF数据服务公开的数据列表中。
为了解决这个问题,我认为最完整的解决方案是能够将TVF称为表并从中创建一个集合。但我不知道该怎么做?!
注意 对数据库的任何更改都需要一些日志记录,因此我有存储过程来执行这些更改,因此我只需要对我的WCF数据服务的只读访问权限,并且我不希望默认集包含服务中发布的表的所有记录
答案 0 :(得分:2)
我认为您可以使用customized data service provider来定义WCF服务的形状,从而获得所需的功能。这可能会变得相当复杂,但由于你已经有了很多IQueryables,你可能会使用Reflection Provider,文档说的是:
反射提供程序在返回实现IQueryable接口的类型的类中公开数据。 WCF数据服务使用反射来推断这些类的数据模型,并且可以将针对资源的基于地址的查询转换为针对暴露的IQueryable类型的基于语言集成查询(LINQ)的查询。
该文档链接到使用Reflection Provider的“How to”。基本上,您只需创建一个具有IQueryable属性的伪上下文类,向数据对象添加一些属性,并将您的DataService指向伪上下文类型。 (如果您使用的是Database / Model-first EF,则可能需要创建实体的部分内容以添加属性或更新T4模板。)
答案 1 :(得分:0)
为什么不创建一个以UserID作为参数的记录集返回参数化存储过程(SP)?实体框架可以使用它。
您可以在SP中呼叫您的TVF,或者只是音译SP中的TVF内容。
如果您需要添加/删除/更新功能,如果您的查询不可更新,则可能还需要这些功能的SP。
答案 2 :(得分:0)
DbContext会自动公开其中定义的所有DbSet属性
我建议您在数据库中创建视图或使用Linq2Sql模板。
- 如果您进行视图,模型设计师会制作正确的DataTable。
- 如果使用linq2sql模板,则可以创建仅具有的数据模型 您想要向其他人展示的属性。
醇>
(在删除linq2sql上的connectioninfomation并使用connctionString分配之后,它就是 怎么用。)
我有多个类型为IQueryable的公共属性,但它们不会出现在WCF数据服务公开的数据列表中。
制作模型并使用linq和方法ExcuteJsonAll。
如果有人收到JSON文件,有人会将其提供。
如何使模型成为存储过程。
在数据库中选择SP。
从数据库更新您的模型
在这里,你带来了SP。
在edmx或模型视图中,您使用SP创建函数。
- 醇>
在创建函数期间,您可以使与DataSet相关的返回值为sp。