/src/NHibernate/Criterion/Subqueries.cs

https://github.com/whut/nhibernate-core · C# · 331 lines · 218 code · 51 blank · 62 comment · 0 complexity · 6823cd0ee42cfed48182d8153fa19ea4 MD5 · raw file

  1. using System;
  2. using System.Linq.Expressions;
  3. using NHibernate.Criterion.Lambda;
  4. using NHibernate.Impl;
  5. namespace NHibernate.Criterion
  6. {
  7. /// <summary>
  8. /// Factory class for AbstractCriterion instances that represent
  9. /// involving subqueries.
  10. /// <c>Expression</c>
  11. /// <c>Projection</c>
  12. /// <c>AbstractCriterion</c>
  13. /// </summary>
  14. public class Subqueries
  15. {
  16. public static AbstractCriterion Exists(DetachedCriteria dc)
  17. {
  18. return new ExistsSubqueryExpression("exists", dc);
  19. }
  20. public static AbstractCriterion NotExists(DetachedCriteria dc)
  21. {
  22. return new ExistsSubqueryExpression("not exists", dc);
  23. }
  24. public static AbstractCriterion PropertyEqAll(String propertyName, DetachedCriteria dc)
  25. {
  26. return new PropertySubqueryExpression(propertyName, "=", "all", dc);
  27. }
  28. public static AbstractCriterion PropertyIn(String propertyName, DetachedCriteria dc)
  29. {
  30. return new PropertySubqueryExpression(propertyName, "in", null, dc);
  31. }
  32. public static AbstractCriterion PropertyNotIn(String propertyName, DetachedCriteria dc)
  33. {
  34. return new PropertySubqueryExpression(propertyName, "not in", null, dc);
  35. }
  36. public static AbstractCriterion PropertyEq(String propertyName, DetachedCriteria dc)
  37. {
  38. return new PropertySubqueryExpression(propertyName, "=", null, dc);
  39. }
  40. public static AbstractCriterion PropertyNe(String propertyName, DetachedCriteria dc)
  41. {
  42. return new PropertySubqueryExpression(propertyName, "<>", null, dc);
  43. }
  44. public static AbstractCriterion PropertyGt(String propertyName, DetachedCriteria dc)
  45. {
  46. return new PropertySubqueryExpression(propertyName, ">", null, dc);
  47. }
  48. public static AbstractCriterion PropertyLt(String propertyName, DetachedCriteria dc)
  49. {
  50. return new PropertySubqueryExpression(propertyName, "<", null, dc);
  51. }
  52. public static AbstractCriterion PropertyGe(String propertyName, DetachedCriteria dc)
  53. {
  54. return new PropertySubqueryExpression(propertyName, ">=", null, dc);
  55. }
  56. public static AbstractCriterion PropertyLe(String propertyName, DetachedCriteria dc)
  57. {
  58. return new PropertySubqueryExpression(propertyName, "<=", null, dc);
  59. }
  60. public static AbstractCriterion PropertyGtAll(String propertyName, DetachedCriteria dc)
  61. {
  62. return new PropertySubqueryExpression(propertyName, ">", "all", dc);
  63. }
  64. public static AbstractCriterion PropertyLtAll(String propertyName, DetachedCriteria dc)
  65. {
  66. return new PropertySubqueryExpression(propertyName, "<", "all", dc);
  67. }
  68. public static AbstractCriterion PropertyGeAll(String propertyName, DetachedCriteria dc)
  69. {
  70. return new PropertySubqueryExpression(propertyName, ">=", "all", dc);
  71. }
  72. public static AbstractCriterion PropertyLeAll(String propertyName, DetachedCriteria dc)
  73. {
  74. return new PropertySubqueryExpression(propertyName, "<=", "all", dc);
  75. }
  76. public static AbstractCriterion PropertyGtSome(String propertyName, DetachedCriteria dc)
  77. {
  78. return new PropertySubqueryExpression(propertyName, ">", "some", dc);
  79. }
  80. public static AbstractCriterion PropertyLtSome(String propertyName, DetachedCriteria dc)
  81. {
  82. return new PropertySubqueryExpression(propertyName, "<", "some", dc);
  83. }
  84. public static AbstractCriterion PropertyGeSome(String propertyName, DetachedCriteria dc)
  85. {
  86. return new PropertySubqueryExpression(propertyName, ">=", "some", dc);
  87. }
  88. public static AbstractCriterion PropertyLeSome(String propertyName, DetachedCriteria dc)
  89. {
  90. return new PropertySubqueryExpression(propertyName, "<=", "some", dc);
  91. }
  92. public static AbstractCriterion EqAll(Object value, DetachedCriteria dc)
  93. {
  94. return new SimpleSubqueryExpression(value, "=", "all", dc);
  95. }
  96. public static AbstractCriterion In(Object value, DetachedCriteria dc)
  97. {
  98. return new SimpleSubqueryExpression(value, "in", null, dc);
  99. }
  100. public static AbstractCriterion NotIn(Object value, DetachedCriteria dc)
  101. {
  102. return new SimpleSubqueryExpression(value, "not in", null, dc);
  103. }
  104. public static AbstractCriterion Eq(Object value, DetachedCriteria dc)
  105. {
  106. return new SimpleSubqueryExpression(value, "=", null, dc);
  107. }
  108. public static AbstractCriterion Gt(Object value, DetachedCriteria dc)
  109. {
  110. return new SimpleSubqueryExpression(value, ">", null, dc);
  111. }
  112. public static AbstractCriterion Lt(Object value, DetachedCriteria dc)
  113. {
  114. return new SimpleSubqueryExpression(value, "<", null, dc);
  115. }
  116. public static AbstractCriterion Ge(Object value, DetachedCriteria dc)
  117. {
  118. return new SimpleSubqueryExpression(value, ">=", null, dc);
  119. }
  120. public static AbstractCriterion Le(Object value, DetachedCriteria dc)
  121. {
  122. return new SimpleSubqueryExpression(value, "<=", null, dc);
  123. }
  124. public static AbstractCriterion Ne(Object value, DetachedCriteria dc)
  125. {
  126. return new SimpleSubqueryExpression(value, "<>", null, dc);
  127. }
  128. public static AbstractCriterion GtAll(Object value, DetachedCriteria dc)
  129. {
  130. return new SimpleSubqueryExpression(value, ">", "all", dc);
  131. }
  132. public static AbstractCriterion LtAll(Object value, DetachedCriteria dc)
  133. {
  134. return new SimpleSubqueryExpression(value, "<", "all", dc);
  135. }
  136. public static AbstractCriterion GeAll(Object value, DetachedCriteria dc)
  137. {
  138. return new SimpleSubqueryExpression(value, ">=", "all", dc);
  139. }
  140. public static AbstractCriterion LeAll(Object value, DetachedCriteria dc)
  141. {
  142. return new SimpleSubqueryExpression(value, "<=", "all", dc);
  143. }
  144. public static AbstractCriterion GtSome(Object value, DetachedCriteria dc)
  145. {
  146. return new SimpleSubqueryExpression(value, ">", "some", dc);
  147. }
  148. public static AbstractCriterion LtSome(Object value, DetachedCriteria dc)
  149. {
  150. return new SimpleSubqueryExpression(value, "<", "some", dc);
  151. }
  152. public static AbstractCriterion GeSome(Object value, DetachedCriteria dc)
  153. {
  154. return new SimpleSubqueryExpression(value, ">=", "some", dc);
  155. }
  156. public static AbstractCriterion LeSome(Object value, DetachedCriteria dc)
  157. {
  158. return new SimpleSubqueryExpression(value, "<=", "some", dc);
  159. }
  160. public static AbstractCriterion Select(DetachedCriteria detachedCriteria)
  161. {
  162. return new SelectSubqueryExpression(detachedCriteria);
  163. }
  164. /// <summary>
  165. /// Create a ICriterion for the specified property subquery expression
  166. /// </summary>
  167. /// <typeparam name="T">generic type</typeparam>
  168. /// <param name="expression">lambda expression</param>
  169. /// <returns>returns LambdaSubqueryBuilder</returns>
  170. public static LambdaSubqueryBuilder WhereProperty<T>(Expression<Func<T, object>> expression)
  171. {
  172. string property = ExpressionProcessor.FindMemberExpression(expression.Body);
  173. return new LambdaSubqueryBuilder(property, null);
  174. }
  175. /// <summary>
  176. /// Create a ICriterion for the specified property subquery expression
  177. /// </summary>
  178. /// <param name="expression">lambda expression</param>
  179. /// <returns>returns LambdaSubqueryBuilder</returns>
  180. public static LambdaSubqueryBuilder WhereProperty(Expression<Func<object>> expression)
  181. {
  182. string property = ExpressionProcessor.FindMemberExpression(expression.Body);
  183. return new LambdaSubqueryBuilder(property, null);
  184. }
  185. /// <summary>
  186. /// Create a ICriterion for the specified value subquery expression
  187. /// </summary>
  188. /// <param name="value">value</param>
  189. /// <returns>returns LambdaSubqueryBuilder</returns>
  190. public static LambdaSubqueryBuilder WhereValue(object value)
  191. {
  192. return new LambdaSubqueryBuilder(null, value);
  193. }
  194. /// <summary>
  195. /// Create ICriterion for subquery expression using lambda syntax
  196. /// </summary>
  197. /// <typeparam name="T">type of property</typeparam>
  198. /// <param name="expression">lambda expression</param>
  199. /// <returns>NHibernate.ICriterion.AbstractCriterion</returns>
  200. public static AbstractCriterion Where<T>(Expression<Func<T, bool>> expression)
  201. {
  202. AbstractCriterion criterion = ExpressionProcessor.ProcessSubquery<T>(LambdaSubqueryType.Exact, expression);
  203. return criterion;
  204. }
  205. /// <summary>
  206. /// Create ICriterion for (exact) subquery expression using lambda syntax
  207. /// </summary>
  208. /// <param name="expression">lambda expression</param>
  209. /// <returns>NHibernate.ICriterion.AbstractCriterion</returns>
  210. public static AbstractCriterion Where(Expression<Func<bool>> expression)
  211. {
  212. AbstractCriterion criterion = ExpressionProcessor.ProcessSubquery(LambdaSubqueryType.Exact, expression);
  213. return criterion;
  214. }
  215. /// <summary>
  216. /// Create ICriterion for (all) subquery expression using lambda syntax
  217. /// </summary>
  218. /// <typeparam name="T">type of property</typeparam>
  219. /// <param name="expression">lambda expression</param>
  220. /// <returns>NHibernate.ICriterion.AbstractCriterion</returns>
  221. public static AbstractCriterion WhereAll<T>(Expression<Func<T, bool>> expression)
  222. {
  223. AbstractCriterion criterion = ExpressionProcessor.ProcessSubquery<T>(LambdaSubqueryType.All, expression);
  224. return criterion;
  225. }
  226. /// <summary>
  227. /// Create ICriterion for (all) subquery expression using lambda syntax
  228. /// </summary>
  229. /// <param name="expression">lambda expression</param>
  230. /// <returns>NHibernate.ICriterion.AbstractCriterion</returns>
  231. public static AbstractCriterion WhereAll(Expression<Func<bool>> expression)
  232. {
  233. AbstractCriterion criterion = ExpressionProcessor.ProcessSubquery(LambdaSubqueryType.All, expression);
  234. return criterion;
  235. }
  236. /// <summary>
  237. /// Create ICriterion for (some) subquery expression using lambda syntax
  238. /// </summary>
  239. /// <typeparam name="T">type of property</typeparam>
  240. /// <param name="expression">lambda expression</param>
  241. /// <returns>NHibernate.ICriterion.AbstractCriterion</returns>
  242. public static AbstractCriterion WhereSome<T>(Expression<Func<T, bool>> expression)
  243. {
  244. AbstractCriterion criterion = ExpressionProcessor.ProcessSubquery<T>(LambdaSubqueryType.Some, expression);
  245. return criterion;
  246. }
  247. /// <summary>
  248. /// Create ICriterion for (some) subquery expression using lambda syntax
  249. /// </summary>
  250. /// <param name="expression">lambda expression</param>
  251. /// <returns>NHibernate.ICriterion.AbstractCriterion</returns>
  252. public static AbstractCriterion WhereSome(Expression<Func<bool>> expression)
  253. {
  254. AbstractCriterion criterion = ExpressionProcessor.ProcessSubquery(LambdaSubqueryType.Some, expression);
  255. return criterion;
  256. }
  257. /// <summary>
  258. /// Add an Exists subquery criterion
  259. /// </summary>
  260. public static AbstractCriterion WhereExists<U>(QueryOver<U> detachedQuery)
  261. {
  262. return Subqueries.Exists(detachedQuery.DetachedCriteria);
  263. }
  264. /// <summary>
  265. /// Add a NotExists subquery criterion
  266. /// </summary>
  267. public static AbstractCriterion WhereNotExists<U>(QueryOver<U> detachedQuery)
  268. {
  269. return Subqueries.NotExists(detachedQuery.DetachedCriteria);
  270. }
  271. public static AbstractCriterion IsNull(DetachedCriteria dc)
  272. {
  273. return new NullSubqueryExpression("IS NULL", dc);
  274. }
  275. public static AbstractCriterion IsNotNull(DetachedCriteria dc)
  276. {
  277. return new NullSubqueryExpression("IS NOT NULL", dc);
  278. }
  279. }
  280. }