Я бы посмотрел на оператор Join:
from r in list join i in listofIds on r.Id equals i select r
Я не уверен, как это будет оптимизировано по сравнению с методами Contains, но, по крайней мере, это дает компилятору лучшее представление о том, что выпытаюсь сделать.Это также сематически ближе к тому, чего вы пытаетесь достичь.
Редактировать: Синтаксис метода расширения для полноты (теперь, когда я понял это):
var results = listofIds.Join(list, i => i, r => r.Id, (i, r) => r);