2016-03-31 17 views
1

Yüklü bir genel yöntem kullanmaya çalışıyorum.Eşleme yöntemini eşleştirerek öğeleri alın

public ICollection<T> GetProductsByMatching<T>(Expression<Func<T, bool>> predicate) 
{ 
    return context.Products.Where(predicate).Include("ShopPlace, Images").ProjectTo<T>().ToList(); 
} 

Ve kullanımını Bu yöntemin:

var a = service.GetProductsByMatching<ProductInfo>(x => x.Name.StartsWith("value") 
     || x.Price < 150); 

Sonunda var Invalid Operation Exception: 'System.Linq.Queryable' ile uyumludur '' türüne hiçbir jenerik yöntem Bazı kod yazdım Sağlanan tip argümanlar ve argümanlar.

Kodumda sorun mu var? Şimdiden teşekkürler! T bir Product olduğunu garantisi yok çünkü

+0

'Çünkü t '=' Product': filtreleme kaynak türüne gerçekleşmesi gerekir iken

Sen, hedef türüne bir yüklemi göre filtreleme çalışıyoruz. Bu kodun ne yapması gerekiyor? Bunun yerine context.et 'demek mi istiyorsunuz? – CodeCaster

+0

@CodeCaster, ürün bilgilerini kullanarak veritabanından alın ve ProductInfo (ViewModel sınıfı) – user3818229

+0

ile eşleştirin Evet, _that_ bölümü koddan aşikar, ancak "İfade >" yazmanız için nedeninizi bulmaya çalışıyorum. ilk yer. Cevabımda şimdi yöntem ismine bağlı olarak bazı varsayımlar yaptım. – CodeCaster

cevap

3

context.Products.Where(predicate) yüklemi açıkçası sadece bir Expression<Func<Product, bool>> değil, bir Expression<Func<T, bool>> olabilir. !

public ICollection<T> GetProductsByMatching<T>(Expression<Func<Product, bool>> predicate) 
{ 
    return context.Products.Where(predicate) 
          .Include("ShopPlace, Images") 
          .ProjectTo<T>() 
          .ToList(); 

} 
+0

Bundan şüpheleniyorum. Ancak, yöntem kullanım kapsamındaki 'Ürün' sınıfına bağlantılar istemiyorum. Ürünleri 'ProductInfo' alanına göre filtrelemek için fonksiyon yazmak mümkün mü? – user3818229

+0

Bu tamamen farklı bir soru. Bunu ProductInfo ile yapamazsınız (çünkü bu sınıfın Ürünle hiçbir ilişkisi yoktur ve Ürününüzün içermediği özellikler içerebilir, böylece ifadeniz veritabanınızdaki varolmayan sütunlara dönüştürülemez). Tüketicilerin arayüzde sorguladığı bir arayüz katmanı ekleyebilir ve bu arayüzü varlık modelinize uygularsınız. – CodeCaster

+0

Aynı özelliklere sahip olduğundan emin olduğumda, 'ProductInfo' sınıfına dayalı kaynak yüklemeyi "Product" sınıfına dönüştürmek/değiştirmek/düzenlemek için bir yol var mı? Yani, ifade gövdesini kurtarmak ama başka bir türe atfetmek istiyorum. – user3818229

İlgili konular