如何创建LINQ视图?

如何创建LINQ视图?,linq,entity-framework,entity-framework-4.1,entity-framework-4.3,Linq,Entity Framework,Entity Framework 4.1,Entity Framework 4.3,我的团队正在使用Entity Framework 4.3.0—代码仅与POCO类一起作为我们的ORM。现在我们使用类的数据库集来访问我们的“表” Public Property Customers As DbSet(Of Customers) 但我们通常基于LINQ中的IsDeleted列进行软删除,并相应地过滤select语句: Dim LiveCustomers = From C In EM.Customers Where C.DeleteFlag = False 我真正

我的团队正在使用Entity Framework 4.3.0—代码仅与POCO类一起作为我们的ORM。现在我们使用类的数据库集来访问我们的“表”

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”和“Customers\u Live”都可以包含“Customer.Customer”类型的实例。

对google的快速检查产生了这个有希望的结果(),但是在更新了我的连接字符串之后,我仍然得到了相同的错误

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


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

像这样更改您的属性:

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()
的功能,但对于视图,您通常不希望有这种功能。如果要添加或删除一个新类,则应使用普通的
客户属性。

您可以让您的POCO类继承自一个新类,该类具有一个新方法,可以为您执行筛选。向新类中添加类似的内容 --伪代码--

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


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

我喜欢这个主意,但我认为它实际上行不通。您需要创建一个从DBSet(Of Customer)继承的类。很确定这是不可能的。它创建了一个设计时错误,关于DbSet没有可公开访问的“Sub-New”
Public Function Filtered() as IEnumerable(Of Out T)
    Return (From x In Me Where x.DeleteFlag).ToList()
End Function