Nice article Sam! What i'd like to point out, in your repo pattern is that, for me at least, having different methods conveys the intention of the code better than a generic filter. For example, with GetById, you just look for references of the method or search it to see where exactly is used. With a generic filter I think it would be harder to find, especially in big code bases, where it tries to bring a Product by Id and follow the logic of the code.