我对实体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
但是通过这种方式我需要从数据库加载所有 AnomalyProducts 。最后得到一个布尔值需要很长时间。
我认为表达树可以帮助我,但我无法做到这一点。
一些帮助将不胜感激。
答案 0 :(得分:2)
你只能对内存数据这样做。 当你将一些linq放在Where(或任何其他)子句中时,实体框架会将其转换为T-SQL。
这不能转换为任何T-SQL:
repo.AnomalyProducts.Where(Function(p) p.IsExcluded).Any
这可以(因为你在内存中获取所有数据:
repo.AnomalyProducts.ToList.Where(Function(p) p.IsExcluded).Any
为了最大限度地减少工作量,您可以创建一个Expression(这是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
我没有对它进行测试,但它应该可以正常工作。