如何创建LINQ视图?

时间:2012-06-15 20:11:22

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

我的团队正在使用Entity Framework 4.3.0 - 仅将代码与POCO类作为我们的ORM。现在我们使用DBSets of Classes来访问我们的'tables'

Public Property Customers As DbSet(Of Customers)

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

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_Live”都可以包含“ _ _。客户”类型的实例。

对谷歌的快速检查产生了这个有希望的结果(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视图,而不会过度影响上游使用?

2 个答案:

答案 0 :(得分: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属性。

答案 1 :(得分: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 =     来自C In EM.Customers.Filtered

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