1

私は、エンティティに対して動的なlinqクエリを使用するプロジェクトに取り組んでいます。私は膨大な量のケースを抱えており、コードの重複を避けるためにメソッドにリファクタリングしています。ただし、ストア式にないメソッドを使用すると、例外がスローされます。解決策の1つは、メソッドの結果を、linqで解釈してクエリを開始できる式にカプセル化することです。

そのコードを考えてみましょう:

parentExpression = x => x.child.Any(y=>IsGoodChild(y,childType, childSize));

private bool IsGoodChild(child c, int childType, int childSize){
     return c.type == childType && c.size == childSize;
}

「parentExpression」は、私のEFの「Parent」タイプの述語です。このコードは例外をスローします。「IsGoodChild」メソッドはブール値を返し、linqによってエンティティに解釈できません。

だから、私はこのようなものが欲しいです:

parentExpression = x => x.child.AsQueryable().Any(IsGoodChild(childType, childSize));

private System.Linq.Expression.Expression<Func<child, bool>> IsGoodChild(int childType, int childSize){
     return  ????
}

では、x.child属性を受け取らなくても、「IsGoodChild(...)」はどのように機能するのでしょうか。事前のThx


再、

このような式でラムダを直接書くとき、私は何かを試みます:

parentExpression = x => x.child.Any(y=>y.type == childType && y.size == childSize);

私はresharperからextractメソッドを使用し、これを生成しました:

private Expression<Func<child,Boolean>> IsGoodChildFunctional(Int32 childType, Int32 childSize)
{
    return c => c.type == childType && c.size == childSize; 
}

しかし、.NETFrameworkデータプロバイダーエラー1025'エラーもあります...

4

2 に答える 2

0

この場合、コンパイラは賢く、匿名メソッドを指定すると、宣言された型に応じて式ツリーまたはコンパイルされたラムダを切り替えます。以下が機能するはずです。

private Expression<Func<child,Boolean>> 
IsGoodChildFunctional(Int32 childType, Int32 childSize)
{
    return c => c.type == childType && c.size == childSize; 
}

これは次のように使用されます:

parentExpression = x => x.child
                         .AsQueryable()
                         .Any(IsGoodChildFunctional(childType,childSize));
于 2012-12-21T13:34:20.120 に答える
0

を返す静的ジェネリックメソッドを作成しますExpression。はExpressionファクトリメソッドを使用して構築されています。

public static Expression<Func<TTargetObject,Boolean>> IsGoodChildFunctional<TTargetObject>(Int32 childType, Int32 childSize)
{
            var e = Expression.Parameter(typeof(TTargetObject), "e");
            var childTypeMember = Expression.MakeMemberAccess(e, typeof(TTargetObject).GetProperty("childType"));
            var childSizeMember = Expression.MakeMemberAccess(e, typeof(TTargetObject).GetProperty("childSize"));
            var  childTypeConstant = Expression.Constant(childType, childType.GetType());
            var  childSizeConstant = Expression.Constant(childSize, childSize.GetType());
            BinaryExpression b;
            BinaryExpression bBis;
            Expression<Func<TTargetObject, bool>> returnedExpression;
            b = Expression.Equal(childTypeMember , childTypeConstant );
            bBis2 = Expression.Equal(childSizeMember, c2);
            var resultExpression = Expression.AndAlso(b, bBis);
            returnedExpression = Expression.Lambda<Func<TTargetObject, bool>>(resultExpression , e);
            return returnedExpression;
}

それはこのように呼ばれます:

var predicat = IsGoodChildFunctional<child>(childType, childSize);
parentExpression = x => x.child.Any(predicat);
于 2013-01-07T16:25:24.260 に答える