NHibernate: загружать только определенные свойства в списке объектов (вместо объектов) - PullRequest
0 голосов
/ 16 ноября 2018

Я использовал NHibernate в своем проекте, и он работает очень хорошо до того времени. Сейчас я столкнулся с одной проблемой и не знаю, как ее решить.

Проблема в том, что я хочу получить из таблицы только x столбцов, а не все, а затем связать это с исходной сущностью с присвоенными значениями столбцов, где для других должно отображаться значение NULL.

например. У меня есть таблица Employee as FieldName DataType ID int FName nvarchar (500) Имя Нварчар (500) Резюме nvarchar (max)

Сверху я хочу получить только Id, FName, LName и связать его с сущностью Employee, а затем мы хотим загрузить Resume, выполнив отдельный вызов базы данных с использованием NHibernate.

Я пытался

var list = session
    .CreateCriteria(typeof (Employee))
    .SetProjection(Projections
                       .ProjectionList()
                       .Add(Projections.Property("Id"))
                       .Add(Projections.Property("FName"))
                       .Add(Projections.Property("LName")))
    .List();

но приведенный выше код возвращает ограниченные данные столбца, но в виде массива объекта. Я хотел, чтобы это связывалось с объектом, а не с массивом объектов. Итак, поделитесь своими мыслями по этому поводу

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Ответ от @ Раббан объясняет это хорошо; +1 к нему. Я просто говорю по-другому.

Как вы заметили, SetProjection вернет массив объектов. Чтобы преобразовать объекты в сущности, вам нужно позвонить SetResultTransformer(Transformers.AliasToBean<Entity>(). Пример кода уже приведен в другом ответе; Я не буду повторять это.

Проблема с вашим текущим кодом в том, что вам нужно ввести имена столбцов как string . Я вообще избегаю такого подхода. Я предпочитаю использовать строго типизированную версию с IQueryOver, как показано ниже:

public IList<TEntity> GetList<TEntity>(ProjectionList columnList, Junction where, int top) where TEntity : BaseEntity
{
    IQueryOver<TEntity> query = null;
    if((columnList != null) && (where != null))
    {
        query = session.QueryOver<TEntity>()
                .Select(columnList)
                .TransformUsing(Transformers.AliasToBean<TEntity>())
                .Where(where);
    }
    else if((columnList != null) && (where == null))
    {
        query = session.QueryOver<TEntity>()
                .Select(columnList)
                .TransformUsing(Transformers.AliasToBean<TEntity>());
    }
    else if((columnList == null) && (where != null))
    {
        query = session.QueryOver<TEntity>()
                .Where(where);
    }
    else
    {
        query = session.QueryOver<TEntity>();
    }

    IList<TEntity> result = query.Take(top).List();
    return result;
}

Вы можете передать строго типизированный список столбцов этому методу, как показано ниже:

ProjectionList columnList = Projections.ProjectionList();
columnList.Add(Projections.Property<Employee>(x => x.Id));
...
...
0 голосов
/ 16 ноября 2018

Вам нужно установить ResultTransformer и вызвать ToList() с типом, иначе NHibernate не знает, что делать с проекциями.И вам также необходимо указать целевые имена свойств в вашем типе Employee.Ваш запрос может выглядеть примерно так:

var list = session
    .CreateCriteria(typeof (Employee))
    .SetProjection(Projections
                   .ProjectionList()
                   .Add(Projections.Property("Id"), "Id")
                   .Add(Projections.Property("FName"), "FirstName")
                   .Add(Projections.Property("LName"), "LastName"))
    .SetResultTransformer(Transformers.AliasToBean<Employee>())
    .List<Employee>();

Обратите внимание: «Id», «FirstName» и «LastName» должны быть свойствами типа Employee.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...