Как я могу предоставить значения для несгруппированных столбцов в NHibernate?

У меня есть запрос критериев:

Session.CreateCriteria<Sell043Report>()
  .SetProjection(.ProjectionList()
    .Add(LambdaProjection.GroupProperty<Sell043Report>(r => r.location))
    .Add(LambdaProjection.GroupProperty<Sell043Report>(r => r.agent))
    .Add(LambdaProjection.GroupProperty<Sell043Report>(r => r.cusip))
    .Add(LambdaProjection.GroupProperty<Sell043Report>(r => r.SettlementDate))
    .Add(LambdaProjection.GroupProperty<Sell043Report>(r => r.salePrice))
    .Add(LambdaProjection.GroupProperty<Sell043Report>(r => r.foreignFx))
    .Add(LambdaProjection.GroupProperty<Sell043Report>(r => r.batchNumber))
    .Add(LambdaProjection.GroupProperty<Sell043Report>(r => r.origSaleDate))
    .Add(LambdaProjection.GroupProperty<Sell043Report>(r => r.planName))
    .Add(LambdaProjection.GroupProperty<Sell043Report>(r => r.dateTimeAdded))
    .Add(LambdaProjection.Sum<Sell043Report>(r => r.shares))
    .Add(LambdaProjection.Sum<Sell043Report>(r => r.netMoney))
    .Add(LambdaProjection.Sum<Sell043Report>(r => r.grossMoney))
    .Add(LambdaProjection.Sum<Sell043Report>(r => r.taxWithheld))
    .Add(LambdaProjection.Sum<Sell043Report>(r => r.fees)))
  .List<Sell043Report>();

который генерирует следующий SQL:

SELECT 
  this_.location as y0_, 
  this_.agent as y1_, 
  this_.cusip as y2_, 
  this_.SettlementDate as y3_, 
  this_.salePrice as y4_, 
  this_.foreignFx as y5_, 
  this_.batchNumber as y6_, 
  this_.origSaleDate as y7_, 
  this_.planName as y8_, 
  this_.dateTimeAdded as y9_, 
  sum(this_.shares) as y10_, 
  sum(this_.netMoney) as y11_, 
  sum(this_.grossMoney) as y12_, 
  sum(this_.taxWithheld) as y13_,
  sum(this_.fees) as y14_ 
FROM 
  MIS_IPS_Sell043Report this_ 
GROUP BY
  this_.location,
  this_.agent,
  this_.cusip,
  this_.SettlementDate,
  this_.salePrice,
  this_.foreignFx,
  this_.batchNumber,
  this_.origSaleDate,
  this_.planName,
  this_.dateTimeAdded

однако таблица Sell043Report имеет дополнительные столбцы, чем те, которые перечислены в операторе SELECT, поэтому я получаю эту ошибку при попытке получить список Sell043Reports:

System.ArgumentException: The value "System.Object[]" is not of type "xyz.Sell043Report" and cannot be used in this generic collection.

Я подозреваю, что проблема в том, что я не выбираю все столбцы для Sell043Report, и поэтому он не знает, как сопоставить набор данных с объектом. Я пытаюсь добиться чего-то вроде этого:

SELECT 
  this_.location as y0_, 
  this_.agent as y1_, 
  this_.cusip as y2_, 
  this_.SettlementDate as y3_, 
  this_.salePrice as y4_, 
  this_.foreignFx as y5_, 
  this_.batchNumber as y6_, 
  this_.origSaleDate as y7_, 
  this_.planName as y8_, 
  this_.dateTimeAdded as y9_, 
  sum(this_.shares) as y10_, 
  sum(this_.netMoney) as y11_, 
  sum(this_.grossMoney) as y12_, 
  sum(this_.taxWithheld) as y13_,
  sum(this_.fees) as y14_,
  '' as Address1,
  '' as Address2 // etc
FROM 
  MIS_IPS_Sell043Report this_ 
GROUP BY
  this_.location,
  this_.agent,
  this_.cusip,
  this_.SettlementDate,
  this_.salePrice,
  this_.foreignFx,
  this_.batchNumber,
  this_.origSaleDate,
  this_.planName,
  this_.dateTimeAdded

Как я могу сделать это с помощью NHibernate?


person ddc0660    schedule 17.03.2010    source источник


Ответы (1)


Вероятно, вам нужно что-то подобное перед вызовом .List‹>():

SetResultTransformer(Transformers.AliasToBean(typeof(Result)))

Где Result — это новый класс, который вы используете для хранения подмножества столбцов, которые вы хотите получить в результате.

См. также этот вопрос:

Проекции в NHibernate

Ошибка, которую вы получаете, связана с тем, что без вызова SetResultTransformer он хочет вернуть массив объектов. Затем вы (непреднамеренно) пытаетесь преобразовать этот массив объектов в список объектов Sell043Report, что невозможно.

Другой вариант — удалить вызов List‹>() и вместо этого работать с массивом объектов.

person Michael Maddox    schedule 17.03.2010
comment
@Майкл, если бы я мог, я бы дал тебе больше очков. =) Спасибо! Никогда не слышал об этих трансформерах. Кажется, я пропустил целый раздел NHibernate. - person ddc0660; 17.03.2010