Проблема C # NHibernate - я пытаюсь вернуть отличительные значения - PullRequest
2 голосов
/ 06 февраля 2011

C # Проблема NHibernate - Я пытаюсь вернуть отличительные значения.

Это то, что я имею до сих пор:

IList<TaskFor> objsResult = session.CreateCriteria(typeof(TaskFor)).setProjection(Projections.Distinct).List<TaskFor>();

return objsResult;

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

С нетерпением ждем ответов.

Спасибо

1012 * Марк *

1 Ответ

4 голосов
/ 06 февраля 2011

Я бы сказал, этот ответ от Эйдана Бойла может быть очень полезным для вас.

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

ICriteria criteria = session.CreateCriteria(typeof(Person));
criteria.SetProjection(
    Projections.Distinct(Projections.ProjectionList()
        .Add(Projections.Alias(Projections.Property("FirstName"), "FirstName"))
        .Add(Projections.Alias(Projections.Property("LastName"), "LastName"))));

criteria.SetResultTransformer(
    new NHibernate.Transform.AliasToBeanResultTransformer(typeof(Person)));

IList people = criteria.List();

Это создает SQL, аналогичный (по крайней мере, в SQL Server):

SELECT DISTINCT FirstName, LastName from Person

Обратите внимание, что в результате будут заполнены только те свойства, которые вы укажете в своей проекции.

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

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