15

ラムダに基づいて以前に C# 式を使用したことがありますが、手動で作成した経験はありません。が与えられたExpression<Func<SomeType, bool>> originalPredicateので、 を作成したいと思いますExpression<Func<OtherType, bool>> translatedPredicate

この場合、 SomeType と OtherType には同じフィールドがありますが、関連していません (継承がなく、共通のインターフェイスに基づいていません)。

背景: LINQ to SQL に基づくリポジトリ実装があります。モデルを POCO に保持するために、LINQ to SQL エンティティを Model エンティティに射影します。式を (仕様の形式として) リポジトリに渡したいのですが、式はモデル エンティティに基づいている必要があります。しかし、これらの式をデータ コンテキストに渡すことはできません。これは、LINQ to SQL エンティティに基づく式が想定されているためです。

4

4 に答える 4

3

私が見つけた別の方法が 1 つあります。それには、元のデリゲートをラップすることも含まれます。

Func<T, object> ExpressionConversion<U>(Expression<Func<T, U>> expression)
{
    Expression<Func<T, object>> g = obj => expression.Compile().Invoke(obj);
    return g.Compile();
}
于 2012-04-24T14:12:05.200 に答える
2

翻訳を行うための暗黙的な方法はありません。引数の型から新しい型を作成するラムダ内に既存のデリゲートをラップする必要があります。

var translatedPredicate = x => originalPredicate(OtherTypeFromSomeType(x))

Whereは、引数からインスタンスをOtherTypeFromSomeType作成します。OtherTypeSomeType

于 2009-03-17T13:08:33.927 に答える