なんかごめんね
このLINQの実装を解説して終わる
http://jump.5ch.net/?https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/Where.cs


seq = list.Where(A).Where(B);

↓↓↓

// 一つ目のWhereはIEnumerable拡張
if(source is List<T> list){
 return new WhereListIterator<T>(list, A);
}

// 二つ目のWhereはWhereListIteratorクラス
return new WhereListIterator<T>(list, CombinePredicates(A, B));

結果として宣言時のseqに入るのは二つ目のWhereListIteratorインスタンス
チェーンの中ではList実体をバトンリレーしてるから入れ子にはなっていない
MoveNext()が取得するのはlist.GetEnumerator()から取得した唯一の値であって間に挟まれたIEnumはまったく関係ない

これ以上分かりやすく伝えるのは俺には無理だ