Вкратце: создайте сериализуемый объект, который содержит спецификацию фильтра. Для простых фильтров перечисление должно работать нормально. Затем в вашей службе WCF сопоставьте эту спецификацию фильтра с тем, что понимают нижние уровни приложения.
NHibernate (и другие объектно-реляционные сопоставители) привязаны к поиску в базе данных. На самом деле не имеет смысла, чтобы ваш клиентский интерфейс был так тесно связан с вашей системой персистентности, и, пытаясь использовать объекты фильтра NHibernate, вы будете использовать их для чего-то, для чего они не предназначены.
Некоторые приложения, которые я видел, имеют несколько уровней, каждый со своими собственными типами данных: одно для пользовательского интерфейса, одно для логики проверки в пользовательском интерфейсе, одно для передачи данных между клиентом и службой, одно для бизнес-логики в домене на сервере, и один для постоянства. Это может показаться экстремальным, но это означает, что объекты могут должным образом отражать потребности каждой конкретной проблемы.
Например, вам может потребоваться поставить под угрозу ваши типы данных, чтобы заставить ваши объекты сериализоваться через границы сервиса. Использование здесь объектов, отличных от тех, которые используются в слоях пользовательского интерфейса и бизнес-логики, скрывает любое уродство.