Efficient SQL query to return parents that satisfy constraints on children
You need something like that:

SELECT e.Id, count(1) AS cnt
  FROM Entity    AS e
  JOIN Attribute AS a ON a.EntityID = e.Id
  JOIN Value     AS v ON v.AttributeId = a.Id
 WHERE (a.Name = 'color' AND v.Value = 'red')
    OR (a.Name = 'size'  AND v.Value = 'small')
--  OR ( ... ) -- extended here
 GROUP BY e.Id
HAVING cnt = 2 -- exact number of desired attributes
;