我的团队正在使用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视图,而不会过度影响上游使用?
答案 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查询时创建接口并执行依赖注入。你必须谷歌那一个:))