Эврика!
Сам нашёл затык, но думаю, многим тоже будет полезно. А дело было... в перекрытом Equals!!
public override bool Equals(object obj)
{
var b2 = (Beacon)obj;
if (b2 == null) return false;
return ID != 0 && ID == b2.ID;
}
Вот эта зараза сразу просадила производительность до целой секунды на смешных 6 элементах — это как вообще?!
Но возникает другой вопрос: каким боком Equals к фильтрации?? Я же сам задаю критерий фильтрования!
К слову: может, что-то не так/медленно/неэффективно в самом Equals? Я его делал для записей СУБД, где очевидно, что если ID равны, то это один и тот же объект и нет смысла сравнивать поля.