1

我使用实体框架实体的扩展方法:

    <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 。最终得到一个布尔值需要很长时间。

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

一些帮助将不胜感激。

4

1 回答 1

2

您只能对内存中的数据执行此操作。当您在 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

我没有测试过它,但它应该工作得很好。

于 2013-01-29T19:27:50.797 回答