это может сделать работу (NH 1.2):
var crit = nhSes.CreateCriteria(typeof(Revision), "r")
.SetProjection(
Projections.SqlProjection(@"r.RevisionId as rid,
COALESCE(lp1.Title, lp2.Title, lp3.Title) as Title,
COALESCE(lp1.Description, lp2.Description, lp3.Description) as Description", new[] {"rid", "Title", "Description"}, new[] {NHibernateUtil.Guid, NHibernateUtil.String,NHibernateUtil.String})
);
crit.CreateCriteria("LocalizedProperty", "lp1", JoinType.InnerJoin);
crit.CreateCriteria("LocalizedProperty", "lp2", JoinType.InnerJoin);
crit.CreateCriteria("LocalizedProperty", "lp3", JoinType.InnerJoin);
crit.Add(Expression.Eq("lp1.LanguageId", langId));
crit.Add(Expression.Sql("lp2.LanguageId = LEFT(:LangId, 2)", langId, NHibernateUtil.String));
crit.Add(Expression.EqProperty("lp3.LanguageId", "r.DefaultPropertiesLanguage"));
обратите внимание, однако, что это не генерирует синтаксическое соединение ANSI, но помещает ограничения в предложение WHERE. Я не думаю, что это проблема, вы делаете внутреннее соединение, а не внешнее соединение.
Также я не помню правильную запись параметров на Expression.Sql
.
Я определил это как :LangId
, хотя это также может быть @LangId
sidenote: как вы можете видеть, хотя это запрос критерия, это просто набор SQL-операторов, разделенных так, чтобы соответствовать API критериев; Вы уверены, что это то, что вам нужно?