Você precisa adicionar um predicado para cada combinação de nome/valor:
SELECT <whatever you need>
FROM Entity_Table et
WHERE et.e_name = 'Joe'
AND EXISTS (SELECT 1
FROM AttributeValue_Table avt
JOIN Entity_AttrVal ea ON ea.e_id = et.e_id
WHERE ea.a_id = avt.av_id
AND avt.prop_name = 'color'
AND avt.prop_value = 'black')
AND EXISTS (SELECT 1
FROM AttributeValue_Table avt
JOIN Entity_AttrVal ea ON ea.e_id = et.e_id
WHERE ea.a_id = avt.av_id
AND avt.prop_name = 'whiskers'
AND avt.prop_value = 'short')
(Peço desculpas se meu dialeto do Sql Server brilha)
Para fazer um número arbitrário de comparações, você teria que gerar o SQL e executá-lo.
Como dito em um comentário, isso mostra que o EAV é uma dor (um antipadrão, na verdade), mas sei por experiência que às vezes simplesmente não há alternativa se estivermos vinculados a um banco de dados relacional.