1: public IEnumerable<T> Select<T>(ISpecification<T> specification, PropertyBag orders, Storage.SortOrder sortOrder)
2: where T : class, new()
3: {
4: try
5: {
6: Expression<Func<T, bool>> expression = null;
7: WhereClauseBuildResult whereBuildResult = null;
8: string sql = string.Format("SELECT {0} FROM {1}",
9: GetFieldNameList<T>(), GetTableName<T>());
10: if (specification != null)
11: {
12: expression = specification.GetExpression();
13: whereBuildResult = GetWhereClauseBuilder<T>().BuildWhereClause(expression);
14: sql += " WHERE " + whereBuildResult.WhereClause;
15: }
16: if (orders != null && sortOrder != Storage.SortOrder.Unspecified)
17: {
18: sql += " ORDER BY " + GetOrderByFieldList<T>(orders);
19: switch (sortOrder)
20: {
21: case Storage.SortOrder.Ascending:
22: sql += " ASC";
23: break;
24: case Storage.SortOrder.Descending:
25: sql += " DESC";
26: break;
27: default: break;
28: }
29: }
30: using (DbCommand command = CreateCommand(sql))
31: {
32: if (command.Connection == null)
33: command.Connection = Connection;
34: if (Transaction != null)
35: command.Transaction = Transaction;
36: if (specification != null)
37: {
38: command.Parameters.Clear();
39: var parameters = GetSelectCriteriaDbParameterList<T>(whereBuildResult.ParameterValues);
40: foreach (var parameter in parameters)
41: {
42: command.Parameters.Add(parameter);
43: }
44: }
45: DbDataReader reader = command.ExecuteReader();
46: List<T> ret = new List<T>();
47: while (reader.Read())
48: {
49: ret.Add(CreateFromReader<T>(reader));
50: }
51: reader.Close(); // Very important: reader MUST be closed !!!
52: return ret;
53: }
54: }
55: catch (ExpressionParseException)
56: {
57: throw;
58: }
59: catch (InfrastructureException)
60: {
61: throw;
62: }
63: catch (Exception ex)
64: {
65: throw ExceptionManager.HandleExceptionAndRethrow<StorageException>(ex,
66: Resources.EX_SELECT_FROM_STORAGE_FAIL,
67: typeof(T).AssemblyQualifiedName,
68: specification != null ? specification.ToString() : "NULL",
69: orders != null ? orders.ToString() : "NULL",
70: sortOrder);
71: }
72: }
73: