实体框架的扩展方法4

时间:2013-01-29 18:16:10

标签: vb.net linq entity-framework expression-trees

我对实体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 。最后得到一个布尔值需要很长时间。

我认为表达树可以帮助我,但我无法做到这一点。

一些帮助将不胜感激。

1 个答案:

答案 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

我没有对它进行测试,但它应该可以正常工作。