【问题标题】:How can I create a LINQ view?如何创建 LINQ 视图?
【发布时间】:2012-06-18 22:20:30
【问题描述】:

我的团队正在使用 Entity Framework 4.3.0 - Code Only 和 POCO 类作为我们的 ORM。现在我们使用 DBSets of Classes 来访问我们的“表”

Public Property Customers As DbSet(Of Customers)

但我们经常根据 LINQ 中的 IsDeleted 列进行软删除,并相应地过滤我们的选择语句:

Dim LiveCustomers =
    From C In EM.Customers
    Where C.DeleteFlag = False

我真正想做的是,与其编写每个查询来包含此过滤器,不如创建一些较低级别的属性(可能在我们继承的 DbContext 级别)提供过滤集,同时保持强类型。

我试过了:

Public Property Customers As DbSet(Of Customer)

Public Property Customers_Live As DbSet(Of Customer)
    Get
        Return From C In Customers
                Where C.DeleteFlag = False
    End Get
    Set(value As DbSet(Of Customer))
        Customers = value
    End Set
End Property

然而这给了我这个错误:

不支持每种类型的多个对象集。对象集“Customers”和“Customers_Live”都可以包含“__.Customer”类型的实例。

在谷歌上的快速检查产生了这个有希望的结果 (How to: Query Objects with Multiple Entity Sets per Type) 但是在更新我的连接字符串后,我仍然遇到同样的错误。

  <add name="EntityManager"
       providerName="System.Data.SqlClient"
       connectionString="
          Data Source=xxxxxx;
          Initial Catalog=xxxxxx;
          User Id=xxxxxx;
          Password=xxxxxx;
          MultipleActiveResultSets=True"/>

所以我的问题是,我怎样才能有效地创建一个允许我应用过滤的 LINQ 视图,而不会对上游使用造成太大影响?

【问题讨论】:

    标签: linq entity-framework entity-framework-4.1 entity-framework-4.3


    【解决方案1】:

    你可以让你的 POCO 类继承自一个新类,该类有一个新方法可以为你进行过滤。将这样的内容添加到新类 --伪代码!--

    Public Function Filtered() as IEnumerable(Of Out T)
        Return (From x In Me Where x.DeleteFlag).ToList()
    End Function
    

    你可以这样称呼它: Dim LiveCustomers = 来自 C 中的 EM.Customers.Filtered

    或者您可以在调用 linq 查询时创建一个接口并进行依赖注入。你必须谷歌那个:)

    【讨论】:

    • 我喜欢这个想法,但我认为它不会真正起作用。您需要创建一个从 DBSet(Of Customer) 继承的类。很确定这是不可能的。它会创建一个关于 DbSet 没有可公开访问的“Sub New”的设计时错误
    【解决方案2】:

    像这样更改您的属性:

    Public Property Customers As DbSet(Of Customer)
    
    Public Property Customers_Live As IQueryable(Of Customer)
        Get
            Return From C In Customers
                    Where C.DeleteFlag = False
        End Get
    End Property
    

    这略有不同,因为您不会拥有 Add()Remove() 之类的东西,但对于视图而言,您通常不会期望拥有这种功能。如果你想添加一个新的,或者删除一个,你应该使用普通的Customers 属性。

    【讨论】:

      猜你喜欢
      • 2012-01-04
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2016-12-06
      相关资源
      最近更新 更多