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 に答える