---
title: "SQL-195: Retrieve ErrorLog"
summary: Read operation against ErrorLog via NHibernate ORM on SQL Server.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-09-25
library: SAIF.Services
reference_type: package
---

# SQL-195: Retrieve ErrorLog

This statement covers the `App_Error` reads in `ErrorLogRepository`: `GetErrorLogEntry` (single row by id), `GetErrorLogs` (a composed query with up to nine conditionally-applied predicates, falling back to a single-row lookup when `ErrorId > 0` or no criteria are set), and `ApplicationNames` (a distinct list of application names). Unlike the rest of this batch, `ErrorLogRepository` is registered against the SQL Server provider (database `NETFRAMEWORK`, user `APPM`, `MsSqlConfiguration.MsSql2008`), so this statement's dialect uses `@` binds, `+` string concatenation, and no `ROWNUM` wrapping — the prior page incorrectly documented it as Oracle.

## Classification

| Field | Value |
| --- | --- |
| **SQL ID** | SQL-195 |
| **Operation type** | Read |
| **Execution method** | ORM (NHibernate LINQ) |
| **Database** | SQL Server |
| **Schema** | [unqualified]** |
| **Command type** | N/A (ORM-generated) |
| **Business object** | `ErrorLogRepository` |
| **Criteria property** | N/A — ORM |
| **Lifecycle method** | `ApplicationNames (property), GetErrorLogEntry, GetErrorLogs` |

## Parameters

| Parameter | Direction | Type | Max length | Description |
| --- | --- | --- | --- | --- |
| `@id` | Input | Integer | N/A | `id` — filters `App_Error_Seq_Num` |
| `@environmentList` | Input | String[] | N/A | Captured list, expanded to `IN` — filters `Environment` |
| `@applicationName` | Input | String | N/A | `criteria.ApplicationName` — filters `App_Name` |
| `@fromdate` / `@today` / other date binds | Input | DateTime | N/A | Computed client-side from `DateTime.Now`/`DateTime.Today` (exactly one predicate applies, per `FilterTimeRange`) — filters `Error_Date` |
| `@fromDate` | Input | DateTime | N/A | `criteria.FromDate` — filters `Error_Date` (Range) |
| `@thruDatePlus1` | Input | DateTime | N/A | `testDate.AddDays(1)` — filters `Error_Date` (Range) |
| `@userName` | Input | String | N/A | `criteria.UserName` — filters `User_Name` |
| `@searchString` | Input | String | N/A | `criteria.SearchString` — filters `State_Info` / `Error_Info` |

## Tables

| Table | Access | Columns used |
| --- | --- | --- |
| [APP_ERROR](../database-tables.md#app_error) | SELECT | `App_Error_Seq_Num`, `App_Name`, `Error_Date`, `Environment`, `Machine_Name`, `Page_Name`, `Error_Source`, `State_Info`, `Error_Info`, `User_Name`, `Deleted_Flag`; filters `App_Error_Seq_Num`, `Environment`, `App_Name`, `Error_Date`, `User_Name`, `State_Info`, `Error_Info` |

## LINQ statement

Source: `Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:53`. Further composing fragments are at lines 55, 70, 79, 83, 90, 99, 100, 103, 107, 111, 115, 120, 124, 132, 138, 144, and 155.

```csharp
// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:53
var query = _unitOfWork.GetRepository<ErrorLog>().Query()
    .Where(x => x.Id == id);

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:55
var result = query.OrderByDescending(x => x.Id).ToList();

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:70
var query = _unitOfWork.GetRepository<ErrorLog>().Query();

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:79
query = query.Where(x => !environmentList.Contains(x.Environment.ToLower()) && x.Environment != "");

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:83
query = query.Where(x => environmentList.Contains(x.Environment.ToLower()) && x.Environment != "");

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:90
query = query.Where(x => x.ApplicationName == criteria.ApplicationName);

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:99
var fromdate = DateTime.Now.AddHours(-2);

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:100
query = query.Where(x => x.ErrorDate >= fromdate);

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:103
query = query.Where(x => x.ErrorDate > DateTime.Today);

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:107
query = query.Where(x => x.ErrorDate > DateTime.Now.AddHours(-24));

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:111
query = query.Where(x => x.ErrorDate >= DateTime.Today.AddDays(-7));

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:115
query = query.Where(x => x.ErrorDate >= DateTime.Today.AddMonths(-1));

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:120
query = query.Where(x => x.ErrorDate >= criteria.FromDate);

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:124
query = query.Where(x => x.ErrorDate <= testDate.AddDays(1));  // add one day to accomodate time

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:132
query = query.Where(x => x.UserName == criteria.UserName);

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:138
query = query.Where(x => x.StateInformation.Contains(criteria.SearchString) ||
                         x.ErrorInformation.Contains(criteria.SearchString));

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:144
var result = query.OrderByDescending(x => x.Id).ToList();

// Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs:155
var data = _unitOfWork.GetRepository<ErrorLog>().Query()
    .Select(x => x.ApplicationName).OrderBy(x => x).Distinct().ToList();
```

## Sample SQL

> **Inferred SQL:** This SQL was inferred from the LINQ statement above and the NHibernate mappings. It is not concrete SQL from source code; NHibernate generates the executed statement at runtime, so aliases, column order, join syntax, and bind-parameter names may differ.

```sql
-- Inferred from LINQ (NHibernate mapping translation); not concrete SQL
-- Dialect: SQL Server (MsSql2008) — binds shown as @name
-- (1) L53-55 — GetErrorLogEntry
SELECT AE.App_Error_Seq_Num,
       AE.App_Name,
       AE.Error_Date,
       AE.Environment,
       AE.Machine_Name,
       AE.Page_Name,
       AE.Error_Source,
       AE.State_Info,
       AE.Error_Info,
       AE.User_Name,
       AE.Deleted_Flag
FROM   App_Error AE
WHERE  AE.App_Error_Seq_Num = @id
ORDER BY AE.App_Error_Seq_Num DESC

-- (2) L70-144 — GetErrorLogs (every predicate is conditional on FilterCriteria; shown all-on)
SELECT AE.App_Error_Seq_Num, AE.App_Name, AE.Error_Date, AE.Environment, AE.Machine_Name,
       AE.Page_Name, AE.Error_Source, AE.State_Info, AE.Error_Info, AE.User_Name, AE.Deleted_Flag
FROM   App_Error AE
WHERE  1 = 1
  -- L79 (Environment == "O"):  AND NOT (LOWER(AE.Environment) IN (@environmentList)) AND AE.Environment <> ''
  -- L83 (any other environment group):
  AND  LOWER(AE.Environment) IN (@environmentList) AND AE.Environment <> ''
  AND  AE.App_Name = @applicationName                       -- L90
  -- L94-127: exactly one ErrorDate predicate per FilterTimeRange:
  AND  AE.Error_Date >= @fromdate                                   -- TwoHour (DateTime.Now.AddHours(-2))
  --   AE.Error_Date >  @today                                                  -- Today
  --   AE.Error_Date >  @nowMinus24h                                            -- Last24Hours
  --   AE.Error_Date >= @todayMinus7d                                           -- Week
  --   AE.Error_Date >= @todayMinus1Month                                       -- Month
  --   AE.Error_Date >= @fromDate [AND AE.Error_Date <= @thruDatePlus1]         -- Range
  AND  AE.User_Name = @userName                                     -- L132
  AND  (AE.State_Info LIKE '%' + @searchString + '%'
        OR AE.Error_Info LIKE '%' + @searchString + '%')     -- L138-139
ORDER BY AE.App_Error_Seq_Num DESC                                              -- L144 (only when anyCriteria)

-- (3) L155 — ApplicationNames
SELECT DISTINCT AE.App_Name
FROM   App_Error AE
ORDER BY AE.App_Name
```

Translation notes:
- **Dialect differs from the rest of the batch:** this repository's unit of work is SQL Server, so there is no `ROWNUM` wrapping and `+` is used for string concatenation. `ErrorLogMap` uses `GeneratedBy.Identity()`, consistent with SQL Server.
- When `criteria.ErrorId > 0` (L66-69) or no criteria are set (L147), `GetErrorLogs` falls back to statement (1).
- Statement (3) — `Select → OrderBy → Distinct` — NHibernate emits `SELECT DISTINCT ... ORDER BY`; the blank-name filter at L158 runs in memory.
- `environmentList` comes from `environmentManager.GetEnvironmentListForGroupCode` (Oracle `ERROR_GROUP_ENVIRONMENT` data via `OnlineSupportRepository`) — a separate statement, see SQL-194.

## Operations and processes
- ErrorLogRepository.ApplicationNames (property) — see [Operations and processes](../operations-processes.md)
- ErrorLogRepository.GetErrorLogEntry — see [Operations and processes](../operations-processes.md)
- ErrorLogRepository.GetErrorLogs — see [Operations and processes](../operations-processes.md)

## Sources
- `Services/SAIF.Services/OnlineSupport/Repositories/ErrorLogRepository.cs (L53, L70, L155)`
