Of the three, I prefer option #3.
The Single Responsibility Principle makes me not want to put searching capabilities on my DTOs or models. Their responsibility is to be data, not to find themselves, nor should needles need to know about haystacks, nor haystacks know about needles.
For what it’s worth, I think it takes most OO practitioners a LONG time to understand why #3 is the best choice. I did OO for a decade, probably, before I really grokked it.
@wilhelmtell, C++ is one of the very few languages with template specialization that make such a system actually work. For most languages, a general purpose “find” method would be a HORRIBLE idea.