Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在实体框架中从表值函数创建集合_C#_Entity Framework_Entity Framework 5_Wcf Data Services - Fatal编程技术网

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

C# 在实体框架中从表值函数创建集合,c#,entity-framework,entity-framework-5,wcf-data-services,C#,Entity Framework,Entity Framework 5,Wcf Data Services,我有一个非常大的表(其中一些可能有超过1000000条记录)的数据库,该数据库的每个用户都应该看到一些数据,因此我们有多个TVF(表值函数),它们获取用户ID并选择该用户可见的表记录(这个操作需要多个SELECT语句,我认为调用TVF比在代码中实现要好得多)。 在向我的客户发布程序的第一个版本中,我有一个具有多个IQueryable类型属性的类,该类使用LinqToSql实现,并且工作得非常好。 现在,我有一个客户端希望使用我的程序集来编写WCF数据服务,因此我必须编写一个从DbContext(

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

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

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

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

注意
对数据库的任何更改都需要一些日志记录,因此我有存储过程来执行这些更改,因此我只需要对WCF数据服务进行只读访问,并且我不希望默认集包含服务中发布的表的所有记录,为什么不创建一个返回参数化存储过程(SP)的记录集呢如果将UserID作为参数,实体框架可以处理这个问题

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


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

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

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

  • 如果创建视图,模型设计器将创建适当的数据表。
  • 如果您使用linq2sql模板,
    您可以创建只有 要向其他人显示的属性。
    (在删除linq2sql上的ConnectionInformation并使用ConctionString进行allocing之后,它只是 如何使用。)
  • 我有多个IQueryable类型的公共属性,但它们不会出现在WCF数据服务公开的数据列表中。

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

    如何将模型转换为存储过程。

  • 在数据库中选择SP

  • 从数据库更新您的模型

    给,你把SP带来

  • 在edmx或模型视图中,使用SP创建函数

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


  • 我认为,通过使用定义WCF服务的形状,您可以获得所需的功能。这可能会变得相当复杂,但由于您已经拥有大量iQueryTables,您可能可以使用,文档中说:

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


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

    我不确定,但我认为您可以使用Select语句,就像从表中选择来填充数据集一样。@Malachi感谢您的回答,但我可以(事实上我已经这样做了)从我的TVF获取IQueryable,但问题是WCF数据服务仅显示我的DbContext的所有DbSet属性,我想隐藏所有属性并显示我的IQueryable属性,但我不知道如何操作!您不能创建限制访问TVF的服务类吗?谢谢您的帮助,但视图无法工作,因为我有人y用户(用户可以创建新用户)因此,我无法为它们中的每一个创建新视图,如果可以,我应该如何将它们与EF一起使用?可能,问题是返回IQueryable。模型的属性对用户开放。您应该执行选择过程。并且…从选择sp创建模型。仅返回IQueryable,不解决问题,我已经能够从返回IQueryableTVF和SP的性能更好。但问题是,所有集合都将使用数据服务发布,用户可以下载它们,并且数据服务不会发布IQueryable类型的属性,因此用户不能使用OData的常规工具下载它们,只能通过编程访问该数据。因此,我们有无效的数据发布hed和更正隐藏的数据!第一件事是SQL中的函数不能更改数据库,但SPs可以!!第二件事是我不能从SP查询数据,并期望优化器为我优化数据(不可能用SP替换表),但我可以用TVF做到这一点,这就是TVF存在的原因(I gues