To all interested, I wrote a reusable/generic transformer that lets me
write type-safe code like:
Session.QueryOver<Tenant>()
.Select(x => x.Id, x => x.FirstName, x
=> x.LastName)
.UnderlyingCriteria.SetResultTransformer(new
PartialObjectTransformer<Tenant>(x => x.Id, x => x.FirstName, x =>
x.LastName))
.List<Tenant>()
The code for the transformer is as follows:
public class PartialObjectTransformer<T> : IResultTransformer
{
private readonly List<PropertyInfo> _properties;
public PartialObjectTransformer(params Expression<Func<T, object>>[]
properties)
{
_properties = new List<PropertyInfo>();
foreach (var property in properties)
{
Expression body = property;
if (body is LambdaExpression)
{
body = ((LambdaExpression)body).Body;
}
switch (body.NodeType)
{
case ExpressionType.Convert:
_properties.Add((PropertyInfo) ((MemberExpression)
((UnaryExpression) body).Operand).Member);
break;
case ExpressionType.MemberAccess:
_properties.Add((PropertyInfo) ((MemberExpression)
body).Member);
break;
default:
throw new InvalidOperationException();
}
}
}
public object TransformTuple(object[] tuple, string[] aliases)
{
var instance = Activator.CreateInstance(typeof(T));
for (var i = 0; i < tuple.Length; i++)
{
_properties[i].SetValue(instance, tuple[i], null);
}
return instance;
}
public IList TransformList(IList collection)
{
return collection;
}
}
Disclaimer, I don't know if this is ideal or will work for you, but it
works on my box. :)
On May 9, 4:20 pm, Jim Geurts <
jgeu...@gmail.com> wrote:
> Thanks for your help with this Richard. I look forward to see what
> comes in the future for easier aliases. In the mean time, I'll look
> into using a DTO and custom transformer that Ayende mentioned here:
http://ayende.com/Blog/archive/2007/08/26/Partial-Object-Queries-With...