Beachten Sie, dass die _src IQueryable<U>
erben und V new()
erben;C# Linq Problem in Methodenkette auswählen
Ich schrieb die folgende Aussage, es gibt keinen Syntaxfehler.
IQueryable<V> a = from s in _src where (s.Right - 1 == s.Left) select new V();
Aber wenn i-RE schrieb es wie folgt, die Visual Studio-Editor einen Fehler in der "Select", klagt
IQueryable<V> d = _src.Where(s => s.Right - 1 == s.Left).Select(s=> new V());
Der Fehler ist:
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)
Könnte jemand erklären, dieses Phänomen, und was ist die Lösung, um den Fehler zu beheben?
=== Edit (2010-03-16 05.35) ===
Dank Mike Zwei. Ich habe auch ein einfaches Beispiel wie Sie versucht. Es funktioniert, aber das tut nicht in meinem. Ich stellte den Code wie folgt:
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();
}
}
}
Ich möchte die LeafNodes funktionieren in Linq Methode Kette Methode neu geschrieben werden. Irgendeine Idee?
Dank IQueryable. Was ist die äquivalente Aussage des ersten? – Gnought
Der von Ihnen hinzugefügte Code wird nicht kompiliert, es sei denn, U ist ein Element mit einer Eigenschaft Right und Left. Es kann also nicht einfach ein 'IQueryable ' sein, es sei denn, es gibt ein 'wo U: ILeftRight' oder so etwas. –
Ich habe es dank Ihrer aktualisierten Probe herausgefunden. Siehe aktualisierte Antwort unten. Danke für die Bereitstellung weiterer Informationen. –