What you are missing is that List<T> implements IEnumerable<T> . Thus, "I have always believed that this syntax is limited to IEnumerable," is technically true, albeit in a limited way. IQueryable implements IEnumerable , as well as IList and arrays. This way you can execute linq queries against anything that implements IEnumerable .
Since Joker<> does not implement IEnumerable<> , your query attempt fails. Extension methods Select<>() , Where<>() , etc. Built around IEnumerable<> . So, if you want to choose from oof , you just need to update your definition of Joker<>
public class Joker<T> : IEnumerable<T> { // (actually implement IEnumerable<T> functionality }
(Editing: the answer really made sense in the context of the originally asked question. The edited question makes my answer obsolete)
source share