Я не большой пользователь nhibernate, но, анализируя всю имеющуюся у нас информацию о сценарии, я чувствую, что ответ на этот вопрос не получится.
Вы отображаете значение, содержащееся в этом классе, в одно значение в БД.
Чтобы разрешить запросы к своим частям, ему нужно понять, как все эти вспомогательные элементы информации в классе Name связаны с полной величиной.
Это означало бы понимание того, что делает ваш собственный код на C #.
обновление 1:
Вышеуказанный ответ касается автоматического создания всего этого для вас и использования точного запроса, который вы там указали.
Вы можете определенно обойти проблему, как предложено @cs. То есть, определяя пользовательскую функцию, которая делает то, что вы хотите, и отображая это в nHibernate.
По крайней мере, это позволит вам сделать что-то вроде:
session.QueryOver<Person>()
.Where(p => session.PersonLastName(p) == "Doe")
.List();
Другим способом было бы определить метод расширения, который переводится в то, что вы хотите, реализуя его, как в этой статье: http://fabiomaulo.blogspot.com/2010/07/nhibernate-linq-provider-extension.html
Использование тогда будет таким:
session.QueryOver<Person>()
.Where(p=> p.Name.LastNameExt() == "Doe")// Ext just to avoid name collision
.List();
Наконец, я не уверен, возможно ли сопоставить под-свойства с определенными пользователем функциями для каждого, так что ваш запрос может остаться неизменным, например:
session.QueryOver<Person>()
.Where(p => p.Name.LastName == "Doe")
.List();
Не во всех случаях вы переходите от объединения данных к анализу данных. Вы единственный, кто знает, действительно ли это что-то покупает, вместо того, чтобы хранить имущество отдельно.