2013-02-01 20 views
8

Bir linq içinde kullanılacak bir ifade üretme işlevim var Where cümlesi. Expression <Func<T,bool>>, jenerik yöntemde oluşturulduğunda istenmeyen bir dönüştürme ekler

public static Expression<Func<T,bool>> GetWhereCondition<T>() where T : IActive 
{ 
    return x => x.Active; 
} 

(IActive sadece 'Etkin' özelliğini tanımlayan notu)

Orada diğer ilgili fonksiyonlar ve fikri i vb iş kurallarını,

kontrol etmek için Jenerik sınıfa gerekli koşulları enjekte olmasıdır

x => Convert(x).Active 

ders rej taşımaktadır:

sorun bu çalıştırdığınızda, döndürülen İfade (ayıklananları görülen) lamda içeriyor olmasıdır linq: tarafından 'LINQ to Varlıklar, yalnızca Varlık Veri Modeli ilkel türlerini yayınlamayı destekler.'

SO benim sorum

...

Bu davranışları nasıl engellerim. Bir dönüşüme gerek yoktur ve açıkça anlaşılmazdır. Bunu önlemek bile mümkün mü?

cevap

10

Eh, bu sadece (dönüşüm boks değer türleri içindir) sınıflarıyla çalışması gereken varsayarak, bir class sınırlaması ekleyebilirsiniz:

public static Expression<Func<T, bool>> GetWhereCondition<T>() where T : class, IActive 
{ 
    return x => x.Active; 
} 

. ..ve dönüşüm gider.

+2

ah, ilginç; temel fark "kısıtlı" ile "çağrıvirt" arasındaki değişimdir; Bu çalışmasına izin vermesi ilginç –

2

bu deneyin:

public static Expression<Func<T, bool>> GetWhereCondition<T>() where T : IActive 
{ 
    return x => x.Active; 
} 
+0

Bu şüpheli bir kopya hatası olduğunu sanıyorum –

İlgili konular