次の 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 はどのように使用できますか?
手動で参加する必要がありますか、それとも ICriteria API は、propetyName 'SalesmanArticle.Article.Goodsgroup.Description' を使用するときに Article と Goodsgroup に参加する必要があることを認識していますか?
編集:
今のところ、このコードをここに書きました:
// 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 がスローされます。
クエリを実行できませんでした [ SELECT sum(this_.Amount) as y0_, sum(this_.Cost) as y1_, goodsgroup2_.Description as y2_, MONTH([Date]) FROM [SalesmanArticle] this_ inner join [Article] article1_ on this_. ArticleId=article1_.ArticleId 内部結合 [GoodsGroup] goodsgroup2_ on article1_.GoodsGroupId=goodsgroup2_.GoodsGroupId GROUP BY goodsgroup2_.Description, MONTH([Date]) ]
[SQL: SELECT sum(this_.Amount) as y0_, sum(this_.Cost) as y1_, goodsgroup2_.Description as y2_, MONTH([Date]) FROM [SalesmanArticle] this_ inner join [Article] article1_ on this_.ArticleId= article1_.ArticleId 内部結合 [GoodsGroup] goodsgroup2_ on article1_.GoodsGroupId=goodsgroup2_.GoodsGroupId GROUP BY goodsgroup2_.Description, MONTH([Date])]
奇妙なことは、NHibernate が 2 つのクエリを作成しようとしていることです!
そして、どちらも正しいです!
コードラインの代わりに
.Add(Projections.SqlGroupProjection(formatedDate, formatedDate, new[]{"MyDate"} , new[] { NHibernateUtil.Int32 })))
使った
.Add(Projections.SqlFunction("MONTH", NHibernateUtil.Int32, Projections.GroupProperty(date))))
SqlFunction の問題は、MONTH(sa.Date) ではなく GROUP BY sa.Date を作成することです。しかし、この方法は構文的に正しく機能しました。
そこで、SqlGroupProjection メソッドに切り替えました。
しかし、とにかくうまくいきません。
誰でも私を助けることができますか?