Я использую последнюю версию Nhibernate в своем проекте MVC
Я хочу сделать запрос к объекту с именами типа «Персона», но персона имеет много свойств.В одном из моих запросов я бы лучше не обладал большинством этих свойств.Вот Person:
public partial class Person
{
virtual public User User { get; set; }
virtual public string FirstName { get; set; }
virtual public string LastName { get; set; }
virtual public int Gender { get; set; }
virtual public Contact Contact { get; set; }
virtual public BirthCertificate PersonBirthCertificate { get; set; }
}
В запросе я просто хочу указать имя и фамилию человека.
Поэтому я решил использовать ResultTransformer и реализовать его следующим образом:
public class PersonResultTransformer : IResultTransformer
{
private Type result;
private PropertyInfo[] properties;
#region IResultTransformer Members
public IList TransformList(IList collection)
{
return collection;
}
public PersonResultTransformer (Type result, params string[] names)
{
this.result = result;
List<PropertyInfo> props = new List<PropertyInfo>();
foreach (string name in names)
{
props.Add(result.GetProperty(name));
}
properties = props.ToArray();
}
public object TransformTuple(object[] tuple, string[] aliases)
{
object instance = Activator.CreateInstance(result);
for (int i = 0; i < tuple.Length; i++)
{
var t = properties[i].Name;
var value = tuple[i].GetType().GetProperty(t).GetValue(tuple[i], null);
instance.GetType().GetProperty(t).SetValue(instance, value, null);
}
return instance;
}
#endregion
}
и для получения желания я хочу с запросом linq:
var person = Repository<Person>.Find(p => p.LastName.Equals("Nadal")
, new PersonResultTransformer (typeof(Person), "FirstName", "LastName"));
////////////////
public IQueryable<T> Find(Expression<Func<T, bool>> expression, IResultTransformer transformer)
{
return Session.CreateCriteria<T>().SetResultTransformer(transformer).List<T>()
.AsQueryable().Where(expression);
}
Это нормально?это может быть более индивидуальным?правильно ли я его использую?
Кажется, что у него есть большая проблема: он получает имя и фамилию всех людей, а затем выбирает из них тех, которые имеют фамилию = "nadal", а производительность нехорошо вообще