2015-11-17 10 views
6

のAC#の式から変換現在時計は私の式が成り立つことを私に示して、私は現在、</p> <pre><code>Expression<Func<T,bool>> </code></pre> <p>に</p> <pre><code>Expression<Func<T,object>> </code></pre> <p>を変換しようとしている

Expression<Func<T,object>> myExpression = model=>Convert(model.IsAnAirplane) 

簡略化します

Expression<Func<T,bool>> myExpression = model=>model.IsAnAirplane 

現在、私だけで、その結果、変換を追加することで成功:

Expression<Func<T,bool>> myExpression = model=>Convert(Convert(model.IsAnAirplane)) 

しかし、根本的なタイプがBOOLされているので、私は右、完全に改宗をスクラッチすることができるはずですか?私は表現の訪問者などに精通していますが、まだ変換を削除する方法を見つけることができません。

Generic unboxing of Expression<Func<T, object>> to Expression<Func<T, TResult>>(これは重複している可能性があります)私のためには機能しません...式がEFによって変換されると、代わりにConvert(Convert()) LINQ to Entitiesは、EDMプリミティブまたは列挙型のキャストのみサポートしています。 "

答えて

4

あなたはこのようなものを使用して任意のConvertラッパーを取り除くことができる必要があります:

Expression<Func<YourModel, object>> boxed = m => m.IsAnAirplane; 

var unboxed = (Expression<Func<YourModel, bool>>)StripConvert(boxed); 

// ... 

public static LambdaExpression StripConvert<T>(Expression<Func<T, object>> source) 
{ 
    Expression result = source.Body; 
    // use a loop in case there are nested Convert expressions for some crazy reason 
    while (((result.NodeType == ExpressionType.Convert) 
       || (result.NodeType == ExpressionType.ConvertChecked)) 
      && (result.Type == typeof(object))) 
    { 
     result = ((UnaryExpression)result).Operand; 
    } 
    return Expression.Lambda(result, source.Parameters); 
} 

ご希望の場合は、プレーンなLambdaExpressionの代わりにExpression<Func<T,U>>を返すようにStripConvertを変更し、方法自体の内部キャストを実行することができその場合、メソッド呼び出しの型推論を利用することはできません。

+0

これはまさに私が望んでいたもので、魅力のように機能します。ありがとう! –

+0

ありがとう、これは本当に私のお尻を保存 –

関連する問題

 関連する問題