Недавно я придумал следующий шаблон:
interface IRepository
{
Product FindByName(string name);
ProjectionType FindByName<ProjectionType>(string name,
Expression<Func<Product, ProjectionType>> selector);
// ...
}
С помощью этого шаблона вы можете, например, задавать проекции на лету с помощью выражений LINQ и анонимных классов, например:
var productView = repository.FindByName("foo",
p => new { p.SomeProperty, p.SomeOtherProperty } );
Который я считаю довольно опрятным.С NHibernate.Linq реализация может выглядеть так:
ProjectionType FindByName<ProjectionType>(string name, Expression<Func<Product, ProjectionType>> selector)
{
using(var session = this.sessionFactory.OpenSession()) {
return session.Linq<Product>()
.Where(p => p.Name.Equals(name))
.Select(selector)
.SingleOrDefault();
}
}
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Остерегайтесь ошибок или плохого стиля в приведенном выше коде.Может даже не скомпилировать.Это только от кончика моей головы.Но я думаю, что идея должна быть довольно ясной.
Есть мысли?