Да, вы можете сделать это с критериями запросов, используя прогнозы. Просто спроецируйте только те свойства, которые вы хотите использовать, и только они будут включены в предложение select скомпилированного запроса.
http://nhibernate.info/doc/nh/en/index.html#querycriteria-projection
Обновление для редактирования
Есть несколько способов сделать это, однако с некоторыми ограничениями. 1) Способ NHibernate.
var list = session.CreateCriteria(typeof (Task))
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Name"), "Name")
.Add(Projections.Property("ID"), "ID")
)
.SetResultTransformer(Transformers.AliasToBean(typeof (Task)))
.List();
Просто назначьте имя свойства в качестве псевдонима для вашей проекции, и преобразователь AliasToBean отобразит эти проекции в фактический класс. Ограничением этого метода является то, что любые сопоставляемые свойства должны иметь установщик в классе POCO, это может быть защищенный установщик, но он должен иметь установщик.
Вы также можете сделать это с помощью linq немного по-другому
var list = session.CreateCriteria(typeof (Task))
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Name"))
.Add(Projections.Property("ID"))
)
.List<IList>()
.Select(l => new Task() {Name = (string) l[0], ID = (Guid) l[1]});
Это просто использование linq для сопоставления индексированного списка, который выводится в новый экземпляр класса Task. Применяется то же ограничение, что и выше, за исключением того, что оно немного более строгое, так как все отображаемые свойства должны иметь открытый установщик, потому что именно это использует linq для заполнения объекта.
Надеюсь, это вам поможет.