>我对实体Framwork实体使用扩展方法:
<Extension()>
Public Function IsExcluded(ByVal item As AnomalyProduct) As Boolean
Dim result As Boolean
If (item.WholesalerProductCode IsNot Nothing) AndAlso (item.WholesalerProductCode = _excludedChar) Then
result = True
Else
result = False
End If
Return result
End Function
我想根据扩展方法结果获取实体列表:
Private Function HasPacksExcluded(ByVal contextId As Guid) As Boolean
Dim result As Boolean
Dim context As ContextManager.ContextData
Dim repo As ILancelotLabEntities
context = _context.GetContext(contextId)
repo = context.RepositoryContext
result = repo.AnomalyProducts.ToList.Where(Function(p) p.IsExcluded).Any
Return result
End Function
但是通过这种方式,我需要从数据库加载所有异常产品。最终得到一个布尔值需要很长时间。
我认为表达式树可以帮助我,但我无法做到这一点。
一些帮助将不胜感激。
您只能使用内存中的数据来执行此操作。当您在 Where(或任何其他)子句中放置一些 linq 时,实体框架会将其转换为 T-SQL。
这不能转换为任何 T-SQL:
repo.AnomalyProducts.Where(Function(p) p.IsExcluded).Any
这可以(因为您正在获取内存中的所有数据:
repo.AnomalyProducts.ToList.Where(Function(p) p.IsExcluded).Any
为了最大程度地减少工作量,您可以创建一个表达式(这是 Where 子句所期望的)并使用它。这只会最大限度地减少您必须复制和粘贴代码的位置数量。
Dim exp As Expression(Of Func(Of AnomalyProduct, Boolean)) = Function(a) Not String.IsNullOrEmpty(a.WholesalerProductCode) AndAlso a.WholesalerProductCode <> _excludedChar
repo.AnomalyProducts.Where(exp).Any
我还没有测试过它,但它应该可以正常工作。