Notez que _src hérite IQueryable<U>
et que V hérite new()
;Problème de sélection de Linq C# dans la chaîne de méthode
J'ai écrit l'instruction suivante, il n'y a pas d'erreur de syntaxe.
IQueryable<V> a = from s in _src where (s.Right - 1 == s.Left) select new V();
Mais si je récrit comme suit, l'éditeur Visual Studio se plaint une erreur dans le "Select"
IQueryable<V> d = _src.Where(s => s.Right - 1 == s.Left).Select(s=> new V());
L'erreur est:
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)
Quelqu'un pourrait-il expliquer ce phénomène, et quelle est la solution pour corriger l'erreur?
=== Modifier (2010-03-16 17:35) ===
Merci Mike Deux. J'ai aussi essayé un exemple simple comme vous. Ca marche mais ça ne marche pas dans le mien. J'ai posté le code comme suit:
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();
}
}
}
Je veux que les LeafNodes fonctionnent à réécrites dans la méthode de la chaîne de méthode LINQ. Une idée?
Merci à tous. Quelle est l'affirmation équivalente du premier? – Gnought
Ce code que vous avez ajouté ne sera compilé que si U est quelque chose qui a une propriété Right and Left. Donc, il ne peut pas seulement être un 'IQueryable ' sauf s'il y a un 'où U: ILeftRight' ou quelque chose. –
Je l'ai compris grâce à votre échantillon mis à jour. Voir la mise à jour ci-dessous. Merci de fournir plus d'informations. –