1

我的团队正在使用 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”类型的实例。

对谷歌的快速检查产生了这个有希望的结果(如何:使用每种类型的多个实体集查询对象)但是在更新我的连接字符串之后,我仍然遇到同样的错误。

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

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

4

2 回答 2

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()or之类的东西Remove(),但是对于您通常不希望拥有这种功能的视图。如果你想添加一个新的,或者删除一个,你应该使用 normalCustomers属性。

于 2012-06-15T20:18:19.597 回答
0

你可以让你的 POCO 类继承自一个新类,该类有一个新方法可以为你进行过滤。在新类中添加这样的东西 --PSEUDO CODE!--

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

你可以这样称呼它: Dim LiveCustomers = From C In EM.Customers.Filtered

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

于 2012-06-15T20:34:52.133 回答