|
13 | 13 | using System.Collections.Generic;
|
14 | 14 | using NHibernate.Dialect;
|
15 | 15 | using NHibernate.Criterion;
|
| 16 | +using NHibernate.Linq; |
16 | 17 | using NHibernate.SqlCommand;
|
17 | 18 | using NHibernate.Transform;
|
18 | 19 | using NHibernate.Type;
|
@@ -922,6 +923,176 @@ public async Task ProjectionsTestAsync()
|
922 | 923 | s.Close();
|
923 | 924 | }
|
924 | 925 |
|
| 926 | + [Test] |
| 927 | + public async Task TestSQLProjectionWithAliasesAsync() |
| 928 | + { |
| 929 | + using(ISession s = OpenSession()) |
| 930 | + using(ITransaction t = s.BeginTransaction()) |
| 931 | + { |
| 932 | + Course course = new Course(); |
| 933 | + course.CourseCode = "HIB"; |
| 934 | + course.Description = "Hibernate Training"; |
| 935 | + await (s.SaveAsync(course)); |
| 936 | + |
| 937 | + Student gavin = new Student(); |
| 938 | + gavin.Name = "Gavin King"; |
| 939 | + gavin.StudentNumber = 667; |
| 940 | + await (s.SaveAsync(gavin)); |
| 941 | + |
| 942 | + Student xam = new Student(); |
| 943 | + xam.Name = "Max Rydahl Andersen"; |
| 944 | + xam.StudentNumber = 101; |
| 945 | + await (s.SaveAsync(xam)); |
| 946 | + |
| 947 | + Enrolment enrolment = new Enrolment(); |
| 948 | + enrolment.Course = course; |
| 949 | + enrolment.CourseCode = course.CourseCode; |
| 950 | + enrolment.Semester = 1; |
| 951 | + enrolment.Year = 1999; |
| 952 | + enrolment.Student = xam; |
| 953 | + enrolment.StudentNumber = xam.StudentNumber; |
| 954 | + xam.Enrolments.Add(enrolment); |
| 955 | + await (s.SaveAsync(enrolment)); |
| 956 | + |
| 957 | + enrolment = new Enrolment(); |
| 958 | + enrolment.Course = course; |
| 959 | + enrolment.CourseCode = course.CourseCode; |
| 960 | + enrolment.Semester = 3; |
| 961 | + enrolment.Year = 1998; |
| 962 | + enrolment.Student = gavin; |
| 963 | + enrolment.StudentNumber = gavin.StudentNumber; |
| 964 | + gavin.Enrolments.Add(enrolment); |
| 965 | + await (s.SaveAsync(enrolment)); |
| 966 | + await (t.CommitAsync()); |
| 967 | + } |
| 968 | + |
| 969 | + using (var s = OpenSession()) |
| 970 | + { |
| 971 | + Student studentSubquery = null; |
| 972 | + var subquery = QueryOver.Of(() => studentSubquery) |
| 973 | + .And( |
| 974 | + Expression.Sql("{e}.studentId = 667 and {studentSubquery}.studentId = 667")).Select(Projections.Id()); |
| 975 | + |
| 976 | + var uniqueResult = await (s.CreateCriteria(typeof(Student)) |
| 977 | + .Add(Subqueries.Exists(subquery.DetachedCriteria)) |
| 978 | + .AddOrder(Order.Asc("Name")) |
| 979 | + .CreateCriteria("Enrolments", "e") |
| 980 | + .AddOrder(Order.Desc("Year")) |
| 981 | + .AddOrder(Order.Desc("Semester")) |
| 982 | + .CreateCriteria("Course", "c") |
| 983 | + .AddOrder(Order.Asc("Description")) |
| 984 | + .SetProjection( |
| 985 | + Projections.SqlProjection( |
| 986 | + "{alias}.studentId as studentNumber, {e}.Semester as semester," |
| 987 | + + " {c}.CourseCode as courseCode, {c}.Description as descr", |
| 988 | + new string[] {"studentNumber", "semester", "courseCode", "descr"}, |
| 989 | + new[] |
| 990 | + { |
| 991 | + TypeFactory.HeuristicType(typeof(long)), |
| 992 | + TypeFactory.HeuristicType(typeof(short)), |
| 993 | + TypeFactory.HeuristicType(typeof(string)), |
| 994 | + TypeFactory.HeuristicType(typeof(string)), |
| 995 | + })) |
| 996 | + .UniqueResultAsync()); |
| 997 | + |
| 998 | + Assert.That(uniqueResult, Is.Not.Null); |
| 999 | + } |
| 1000 | + |
| 1001 | + using (var s = OpenSession()) |
| 1002 | + using (s.BeginTransaction()) |
| 1003 | + { |
| 1004 | + await (s.Query<Enrolment>().DeleteAsync()); |
| 1005 | + await (s.Query<Student>().DeleteAsync()); |
| 1006 | + await (s.Query<Course>().DeleteAsync()); |
| 1007 | + await (s.GetCurrentTransaction().CommitAsync()); |
| 1008 | + } |
| 1009 | + } |
| 1010 | + |
| 1011 | + [Test] |
| 1012 | + public async Task TestSQLProjectionWithDuplicateAliasesAsync() |
| 1013 | + { |
| 1014 | + using(ISession s = OpenSession()) |
| 1015 | + using(ITransaction t = s.BeginTransaction()) |
| 1016 | + { |
| 1017 | + Course course = new Course(); |
| 1018 | + course.CourseCode = "HIB"; |
| 1019 | + course.Description = "Hibernate Training"; |
| 1020 | + await (s.SaveAsync(course)); |
| 1021 | + |
| 1022 | + Student gavin = new Student(); |
| 1023 | + gavin.Name = "Gavin King"; |
| 1024 | + gavin.StudentNumber = 667; |
| 1025 | + await (s.SaveAsync(gavin)); |
| 1026 | + |
| 1027 | + Student xam = new Student(); |
| 1028 | + xam.Name = "Max Rydahl Andersen"; |
| 1029 | + xam.StudentNumber = 101; |
| 1030 | + await (s.SaveAsync(xam)); |
| 1031 | + |
| 1032 | + Enrolment enrolment = new Enrolment(); |
| 1033 | + enrolment.Course = course; |
| 1034 | + enrolment.CourseCode = course.CourseCode; |
| 1035 | + enrolment.Semester = 1; |
| 1036 | + enrolment.Year = 1999; |
| 1037 | + enrolment.Student = xam; |
| 1038 | + enrolment.StudentNumber = xam.StudentNumber; |
| 1039 | + xam.Enrolments.Add(enrolment); |
| 1040 | + await (s.SaveAsync(enrolment)); |
| 1041 | + |
| 1042 | + enrolment = new Enrolment(); |
| 1043 | + enrolment.Course = course; |
| 1044 | + enrolment.CourseCode = course.CourseCode; |
| 1045 | + enrolment.Semester = 3; |
| 1046 | + enrolment.Year = 1998; |
| 1047 | + enrolment.Student = gavin; |
| 1048 | + enrolment.StudentNumber = gavin.StudentNumber; |
| 1049 | + gavin.Enrolments.Add(enrolment); |
| 1050 | + await (s.SaveAsync(enrolment)); |
| 1051 | + await (t.CommitAsync()); |
| 1052 | + } |
| 1053 | + |
| 1054 | + using (var s = OpenSession()) |
| 1055 | + { |
| 1056 | + Student student = null; |
| 1057 | + var subquery = QueryOver.Of(() => student) |
| 1058 | + .And( |
| 1059 | + Expression.Sql("{e}.studentId = 667 and {student}.studentId = 667")).Select(Projections.Id()); |
| 1060 | + |
| 1061 | + var uniqueResult = await (s.CreateCriteria(typeof(Student), "student") |
| 1062 | + .Add(Subqueries.Exists(subquery.DetachedCriteria)) |
| 1063 | + .AddOrder(Order.Asc("Name")) |
| 1064 | + .CreateCriteria("Enrolments", "e") |
| 1065 | + .AddOrder(Order.Desc("Year")) |
| 1066 | + .AddOrder(Order.Desc("Semester")) |
| 1067 | + .CreateCriteria("Course", "c") |
| 1068 | + .AddOrder(Order.Asc("Description")) |
| 1069 | + .SetProjection( |
| 1070 | + Projections.SqlProjection( |
| 1071 | + "{alias}.studentId as studentNumber, {e}.Semester as semester," |
| 1072 | + + " {c}.CourseCode as courseCode, {c}.Description as descr", |
| 1073 | + new string[] {"studentNumber", "semester", "courseCode", "descr"}, |
| 1074 | + new[] |
| 1075 | + { |
| 1076 | + TypeFactory.HeuristicType(typeof(long)), |
| 1077 | + TypeFactory.HeuristicType(typeof(short)), |
| 1078 | + TypeFactory.HeuristicType(typeof(string)), |
| 1079 | + TypeFactory.HeuristicType(typeof(string)), |
| 1080 | + })) |
| 1081 | + .UniqueResultAsync()); |
| 1082 | + |
| 1083 | + Assert.That(uniqueResult, Is.Not.Null); |
| 1084 | + } |
| 1085 | + |
| 1086 | + using (var s = OpenSession()) |
| 1087 | + using (s.BeginTransaction()) |
| 1088 | + { |
| 1089 | + await (s.Query<Enrolment>().DeleteAsync()); |
| 1090 | + await (s.Query<Student>().DeleteAsync()); |
| 1091 | + await (s.Query<Course>().DeleteAsync()); |
| 1092 | + await (s.GetCurrentTransaction().CommitAsync()); |
| 1093 | + } |
| 1094 | + } |
| 1095 | + |
925 | 1096 | [Test]
|
926 | 1097 | public async Task CloningProjectionsTestAsync()
|
927 | 1098 | {
|
|
0 commit comments