Это должно работать
houses.AsQueryable<House>().Where(rs=>rs.MainRoom.Type == RoomType.Kitchen);
Зачем вам нужен динамический linq в этом случае? Какой выход вы ожидаете
По моему предпочтению, следует избегать использования склонной к ошибкам строки. Если имя вашего класса или свойства изменилось, вы не сможете найти ошибку, пока не встретите ее.
Скорее используйте выражение
Expression<Func<House, bool>>
filter = (p) => p.MainRoom.Type == RoomType.Kitchen;
filter = (p) => p.MainRoom.Area > 200;
filter = (p) => p.Rooms.Sum(rs => rs.Area) > 500;
filter = (p) => p.Address.Contains("abc");
filter = (p) => p.Area > 200;
...
var aRoomsHouses = houses.AsQueryable<House>().Where(filter);
Вы можете создать выражение, в котором вы решите, какой строковый фильтр использовать. Лучше создать статический класс или оператор switch, который дает вам другой тип выражения, который вы можете использовать в качестве аргумента where.