NHibernate Linq Select Projection - получение полных объектов с частичным выбором - PullRequest
2 голосов
/ 07 ноября 2011

У меня возникла небольшая проблема с частичной проекцией.

У меня есть метод в наших списках, чтобы мы могли легко загружать в них объекты, однако загрузка полных объектов, конечно, не вариант.Это означает, что я должен сделать некоторую проекцию, я сделал это здесь, где вы можете выбрать, какое свойство иметь в качестве DisplayValue.

Использование кода выглядит следующим образом:

dropCompany.LoadEntityList(Customer.Company, x => x.CompanyName, x => x.IsCompany);

Частьреализация выглядит следующим образом:

public void LoadEntityList<T>(T selectedEntity,
                              System.Linq.Expressions.Expression<Func<T, string>> selector,
                              System.Linq.Expressions.Expression<Func<T,bool>> where = null)
    where T : FlexyBook.Infrastructure.Entity
{
    var wCollection = new ObjectWrapperCollection<object>();
    IQueryable<T> query = FlexyBook.Repository.DomainService<T>.GetDomainService().GetAll();
    if (where != null)
        query = query.Where(where);
    foreach (var item in query.Select(x =>
        new ObjectWrapper<object>()
        {
            Value = x.ID,
            Text = selector.Compile()(x)
        })
        .ToList().OrderBy(x => x.Text))
    {
        wCollection.List.Add(item);
    }
}

Проблема в том, что это приводит к тому, что полная сущность загружается из базы данных, а затем проецируется.Проблема также очень очевидна, именно эта строка «selector.Compile () (x)».

Моя проблема в том, что я понятия не имею, как разрешить этому частичному выбору перейти в NHibernate как проекцию.Очевидно, мне нужен селектор идентификаторов для идентификации сущностей, и я не хочу менять способ вызова метода.

Есть ли способ решить эту проблему?

1 Ответ

1 голос
/ 03 декабря 2011

Одним из способов частичного выбора было бы изменить выражение выбора на тип:

System.Linq.Expressions.Expression<Func<T, ObjectWrapper<object>>>

Тогда вы бы назвали его следующим образом:

dropCompany.LoadEntityList(Customer.Company, x => new ObjectWrapper<object>() { Value = x.ID, Text = x.CompanyName, x => x.IsCompany);

Реализация:

public void LoadEntityList<T>(T selectedEntity, System.Linq.Expressions.Expression<Func<T, ObjectWrapper<object>>> selector,System.Linq.Expressions.Expression<Func<T,bool>> where = null) where T : FlexyBook.Infrastructure.Entity
{
    var wCollection = new ObjectWrapperCollection<object>();
    IQueryable<T> query = FlexyBook.Repository.DomainService<T>.GetDomainService().GetAll();
    if (where != null)
        query = query.Where(where);
    foreach (var item in query.Select(selector).ToList().OrderBy(x => x.Text))
    {
        wCollection.List.Add(item);
    }
}
...