Я хочу создать следующий оператор T-SQL:
SELECT SUM (sa.Amount) as 'SumAmount',
SUM(sa.Cost) as 'SumCost',
gg.[Description] as 'Goodsgroup', Month(sa.[Date]) as 'Month'
FROM SalesmanArticle sa
INNER JOIN Article a
ON a.ArticleId = sa.ArticleId
INNER JOIN GoodsGroup gg
ON gg.GoodsGroupId = a.GoodsGroupId
GROUP BY gg.[Description], Month(sa.[Date])
ORDER BY 'Month', 'Goodsgroup'
Возможно ли это с помощью NHibernates ICriteria?
Как использовать функцию Month-T-SQL-Function?
Должен ли я присоединиться вручную или API-интерфейс ICriteria знает, что при использовании propetyName 'SalesmanArticle.Article.Goodsgroup.Description' он должен присоединиться к статье и товарной группе?
РЕДАКТИРОВАТЬ:
Пока я написал этот код здесь:
// typesafe properties
string article = typeof(Article).Name;
string goodsGroup = typeof(GoodsGroup).Name;
string salesmanArticle = typeof(SalesmanArticle).Name;
string amount = Reflector.GetPropertyName<SalesmanArticle>(x => x.Amount);
string cost = Reflector.GetPropertyName<SalesmanArticle>(x => x.Cost);
string description = string.Format("{0}.{1}",
goodsGroup, Reflector.GetPropertyName<SalesmanArticle>(x => x.Article.GoodsGroup.Description));
string date = Reflector.GetPropertyName<SalesmanArticle>(x => x.Date);
string formatedDate = string.Format("MONTH([{0}])", date);
return GetSession()
// FROM
.CreateCriteria(typeof(SalesmanArticle), salesmanArticle)
// JOIN
.CreateCriteria(article, article, JoinType.InnerJoin)
.CreateCriteria(goodsGroup, goodsGroup, JoinType.InnerJoin)
// SELECT
.SetProjection(Projections.ProjectionList()
.Add(Projections.Sum(amount))
.Add(Projections.Sum(cost))
// GROUP BY
.Add(Projections.GroupProperty(description))
.Add(Projections.SqlGroupProjection(formatedDate, formatedDate, new[]{"MyDate"} , new[] { NHibernateUtil.Int32 })))
.List();
Но выдается AdoException:
не удалось выполнить запрос [ВЫБРАТЬ сумму (this_.Amount) как y0_, сумма (this_.Cost) как y1_, goodsgroup2_.Description как y2_, MONTH ([Date]) FROM [продавец] article_ внутреннее соединение [Article] article1_ для this_.ArticleId = article1_.ArticleId внутреннее соединение [GoodsGroup] goodsgroup2_для article1_.GoodsGroupId = goodsgroup2_.GoodsGroupId GROUP BY goodsgroup2_.Description, MONTH ([Date])]
[SQL: ВЫБЕРИТЕ сумму (this_.Amount) как y0_, сумму (this_.Cost) как y1_, goodsgroup2_.Описание в формате y2_, МЕСЯЦ ([Дата]) FROM [SalesmanArticle] this_ внутреннее соединение [Article] article1_ для this_.ArticleId = article1_.ArticleId внутреннее соединение [GoodsGroup] goodsgroup2_ для article1_.GoodsGroupId = goodsgroup2_.GoodsGroupId GROUP BY goodsgroup2_.Description, MONTH ([Дата])]
1021 *
Странно то, что NHibernate пытается создать 2 запроса?!
И ОБА из них верны!
Вместо кодовой строки
.Add(Projections.SqlGroupProjection(formatedDate, formatedDate, new[]{"MyDate"} , new[] { NHibernateUtil.Int32 })))
Я использовал
.Add(Projections.SqlFunction("MONTH", NHibernateUtil.Int32, Projections.GroupProperty(date))))
Проблема с SqlFunction заключается в том, что она создает GROUP BY sa.Date вместо MONTH (sa.Date).Но этот метод работал синтаксически правильно.
Поэтому я переключился на метод SqlGroupProjection.
Но все равно он не работает.
Кто-нибудь может мне помочь?