2015-11-17 73 views
6

AC# ifadeden dönüştürmekŞu izle ifadem tutan bana gösteriyor Şu anda bir</p> <pre><code>Expression<Func<T,bool>> </code></pre> <p>bir</p> <pre><code>Expression<Func<T,object>> </code></pre> <p>dönüştürmek çalışıyorum

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

Bunu basitleştirmek istiyorum

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

Ama altta yatan tipi bool IS beri, doğru, tamamen dönüştürür çizik gerekir:

Expression<Func<T,bool>> myExpression = model=>model.IsAnAirplane 
Şu anda sadece sonuçlanan bir dönüştürmek ekleyerek başarılı? İfade ziyaretçileri vb. Ile tanıyorum ama yine de dönüştürmeyi nasıl kaldıracağımı anlayamıyorum.

Düzeltme: Bu soruya verilen yanıtın bu yanıtı Generic unboxing of Expression<Func<T, object>> to Expression<Func<T, TResult>> (bu olası bir çoğaltma olabilir) benim için çalışmıyor ... İfade EF tarafından çevrildikçe, bunun yerine Dönüştür (Convert()) işlevini görebiliyorsunuz ilk dönüştürmeyi kaldırmanın ..., "System.Object" türünü yazmak için "System.Boolean" türünü kullanılamadı. LINQ to Entities, yalnızca EDM ilkel veya numaralandırma türlerini yayınlamayı destekler. "

cevap

4

Böyle bir şey kullanarak herhangi Convert sarmalayıcılarını atmak gerekir: İsterseniz

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); 
} 

, bir düz LambdaExpression yerine Expression<Func<T,U>> dönmek ve yöntemin kendi içinde dönüşümünü gerçekleştirmek için StripConvert değiştirebilir Ancak, bu durumda, yöntem çağrısı için tip-inferencing'den yararlanamazsınız.

+0

Bu tam olarak istediğimi yapar ve bir çekicilik gibi çalışır, teşekkürler! –

+0

Teşekkürler, bu gerçekten benim popomu kurtardı –

İlgili konular