NHibernate 3 - введите безопасный способ выбора отдельного списка значений - PullRequest
0 голосов
/ 07 сентября 2011

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

Единственная вещь, которая работает для меня до сих пор, использует магические строки и массив объектов.Есть ли лучший (безопасный для типов) способ?

  var projectionList = Projections.ProjectionList();
  projectionList.Add(Projections.Property("FolderName"));
  projectionList.Add(Projections.Property("FolderOrder"));

  var list = Session.QueryOver<T>()
    .Where(d => d.Company.Id == SharePointContextHelper.Current.CurrentCompanyId)
    .OrderBy(t => t.FolderOrder).Asc
    .Select(Projections.Distinct(projectionList))
    .List<object[]>()
    .ToList();

  return list.Select(l => new Folder((string)l[0])).ToList();

Кстати, выполнение с linq не будет работать, вы должны выбрать FolderOrder, иначе вы получите ошибку sql (ORDER BY items must appear in the select list if SELECT DISTINCT is specified.)

, а затем это даст известноеошибка: Expression type 'NhDistinctExpression' is not supported by this SelectClauseVisitor. в отношении использования анонимных типов с различными

 var q = Session.Query<T>()
    .Where(d => d.Company.Id == SharePointContextHelper.Current.CurrentCompanyId)
    .OrderBy(d => d.FolderOrder)
    .Select(d => new {d.FolderName, d.FolderOrder})
    .Distinct();
  return q.ToList().Select(f => new Folder(f));

Кажется, что много основ и сложностей, чтобы сделать некоторые основы SQL ....

Ответы [ 2 ]

2 голосов
/ 07 сентября 2011

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

  var projectionList = Projections.ProjectionList();
  projectionList.Add(Projections.Property<T>(d => d.FolderName));
  projectionList.Add(Projections.Property<T>(d => d.FolderOrder));
1 голос
/ 07 сентября 2011

вещь object [] неизбежна, если только вы не определите специальный класс / структуру для хранения только FolderName и FolderOrder.
см. это замечательное введение в QueryOver для type-saftey, которое, безусловно, поддерживается.
удачи.

...