2010-03-16 17 views
5

_src'nin IQueryable<U> ve V öğelerini new() devraldığını unutmayın;C# Linq Yöntemde Sorun Seçin Zincir

Aşağıdaki ifadeyi yazdım, sözdizimi hatası yok.

The type arguments cannot be inferred from the usage. Try specifying the type arguments explicitly. 
Candidates are: 
    System.Collections.Generic.IEnumerable<V> Select<U,V>(this System.Collections.Generic.IEnumerable<U>, System.Func<U,V>) (in class Enumerable) 
    System.Linq.IQueryable<V> Select<U,V>(this System.Linq.IQueryable<U>, System.Linq.Expressions.Expression<System.Func<U,V>>) (in class Queryable) 

kimse açıklayabilir misiniz i eğer

IQueryable<V> a = from s in _src where (s.Right - 1 == s.Left) select new V(); 

Fakat aşağıda açıklandığı gibi, Visual Studio editörü

IQueryable<V> d = _src.Where(s => s.Right - 1 == s.Left).Select(s=> new V()); 

Hata olduğunu "Seç" bir hata şikayet YENİDEN yazdı Bu fenomen ve hatayı düzeltmek için çözüm nedir?

=== Düzenleme (2010-03-16 05:35)

Teşekkür Mike İki ===. Ben de senin gibi basit bir örneği denedim. İşe yarıyor ama bu benimkilerde yok.

public class NSM<U, V> where U : IQueryable<U> where V : new() 
    { 
    private U _src; 
    public NSM(U source) { _src = source; } 
    public IQueryable<V> LeafNodes 
    { 
     get 
     { 
      return from s in _src where (s.Right - 1 == s.Left) select new V(); 
     } 
    } 
    } 

Ben LeafNodes linq yöntemi zincir yöntem haline yeniden yazılması için işlev istiyorum şu şekildedir: Ben kodu yayınlanmıştır. Herhangi bir fikir? derleyici Eğer yürütülecek istediklerini yöntemler seçemezsiniz

+0

Teşekkür IQueryable atanacak. İlkinin eşdeğer ifadesi nedir? – Gnought

+0

Eklediğiniz kod U, Sağ ve Sol özelliği olan bir şey olmadıkça derlenmez. Bu yüzden bir "U: ILeftRight" ya da bir şey olmadığı sürece "IQueryable " olamaz. –

+0

Güncellenmiş örneğiniz sayesinde bunu anladım. Aşağıdaki güncellenmiş cevaba bakınız. Daha fazla bilgi için teşekkürler. –

cevap

1

_src türü nedir? Doğrudan IQueryable uyguluyor mu? Soruyorum çünkü işe gösterdiğiniz şeylerin basitleştirilmiş bir örneğini alabiliyorum.

IQueryable<int> ints = Enumerable.Range(4, 12).AsQueryable(); 

IQueryable<decimal> foo = from s in ints where s > 7 select s * 4.2m; 

IQueryable<decimal> bar = ints.Where(s => s > 7).Select(s => s * 4.2m); 

Her ikisi de benim için çalışmayı seçer. Derleyici eğer inters (veya sizin _src durumunda) bir IQueryable olduğunu bilirse, o zaman doğru aşırı yükü arayacaktır. Yoksa tamamen bir şeyi mi özlüyorum? Belki de onu basitleştirdim ve biraz detay kaybettim.

DÜZENLEME: Bazı örnek kodları bazı değişikliklerle kullanmak için bunu genişletme.

hüner Queryable.Select bir Expression<Func<X, V>> alır ve Enumerable.Select

Expression<Func<X,V>> expression = s => new V(); 
IQueryable<V> d = _src.Where(s => s.Right - 1 == s.Left).Select(expression); 
1

hata sırasında oluşmaktadır çünkü: Select uzatma yöntemini IEnumerable<T> veya Select uzatma yöntemi için IQueryable<T>

1

içine çalıştıran sorun için Select için 2 farklı kullanımları içinde olmasıdır İkinci örneğiniz ve ikisine de ulaşmak için uygun kullanım ifadesine sahipsiniz. Derleyici, kullanmak istediğiniz ifadeden anlayamaz. Daha fazla uzmanlık gerektiren bir çağrı kullanmak zorundasınız, eğer artık ihtiyaç duymuyorsa, ya da hangisini kullanmak istediğinizi açıklığa kavuşturarak, bir aracı seçin veya kaldırın.

+0

"AsQueryable()" ı aşağıdaki gibi seçin: IQueryable d = _src.Where (s => s.Right - 1 == s.Left) .AsQueryable() Seç (s => new V()); Hata da aynıdır. – Gnought

0

gidermek için bir Func<X,V> Yani sadece Select

için Veya özgün koddan Expression sürümünü sağlamak için gereken almasıdır derleyici için belirsizlik AsEnumerable() işlevini kullanın

src.AsEnumerable().Select(s => new V()); 

Ya da tüm

IQueryable<V> x = src.AsEnumerable().Select(s => new V()).AsQueryable(); 
+0

Ancak bu, IQueryable yerine IEnumerable döndürecektir. Dönüş türünü değiştirmeden düzeltme nedir? – Gnought

+0

@Gnought Düzenlenmiş gönderiye ekliyorum. – Cornelius

+0

denemeniz için teşekkürler. – Gnought