241 lines
9.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
namespace gehGassi.Core.Interfaces
{
/// <summary>
/// Schnittstellenbeschreibung für ein generisches Repository.
/// Das Repository verfügt bewusst über keine Update / Save Funktionen.
/// Das Prinzip legt nahe, dass ein Repository wie eine Collection zu sehen ist.
/// Speichern von Änderungen wird über das UnitOfWork-Pattern durchgeführt.
/// </summary>
/// <typeparam name="T">Typ des Repository</typeparam>
public interface IRepository<T> where T : class
{
#region Get / Abfragen
/// <summary>
/// Gibt eine Entität anhand der eindeutigen Id zurück
/// </summary>
/// <param name="id">Id der Entität</param>
/// <returns>Entität oder null, wenn nicht gefunden</returns>
T Get(object id);
/// <summary>
/// Gibt eine Entität anhand der eindeutigen Id zurück
/// </summary>
/// <param name="id">Id der Entität</param>
/// <returns>Entität oder null, wenn nicht gefunden</returns>
Task<T> GetAsync(object id);
/// <summary>
/// Gibt alle Entitäten zurück
/// </summary>
/// <returns>Liste aller Entitäten</returns>
IEnumerable<T> GetAll();
/// <summary>
/// Gibt alle Entitäten zurück
/// </summary>
/// <returns>Liste aller Entitäten</returns>
Task<IEnumerable<T>> GetAllAsync();
/// <summary>
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
/// </summary>
/// <param name="predicate">Kriterien</param>
/// <returns>Liste gefundener Entitäten</returns>
IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
/// <summary>
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
/// </summary>
/// <param name="predicate">Kriterien</param>
/// <returns>Liste gefundener Entitäten</returns>
Task<IEnumerable<T>> FindAsync(Expression<Func<T, bool>> predicate);
/// <summary>
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
/// </summary>
/// <param name="predicate">Kriterien</param>
/// <returns>Liste gefundener Entitäten</returns>
Task<IEnumerable<T>> FindNoTrackingAsync(Expression<Func<T, bool>> predicate);
/// <summary>
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen.
/// Hier wird zuerst die SQL-Abfrage ausgeführt!
/// </summary>
/// <param name="rawSql">SQL-String</param>
/// <param name="predicate">Kriterien</param>
/// <returns>Liste gefundener Entitäten</returns>
IEnumerable<T> Find(string rawSql, Expression<Func<T, bool>> predicate = null);
/// <summary>
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
/// Hier wird zuerst die SQL-Abfrage ausgeführt!
/// </summary>
/// <param name="rawSql">SQL-String</param>
/// <param name="predicate">Kriterien</param>
/// <returns>Liste gefundener Entitäten</returns>
Task<IEnumerable<T>> FindAsync(string rawSql, Expression<Func<T, bool>> predicate = null);
/// <summary>
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
/// Hier wird zuerst die SQL-Abfrage ausgeführt!
/// </summary>
/// <param name="rawSql">SQL-String</param>
/// <param name="parameters">SQL-Parameter</param>
/// <returns>Liste gefundener Entitäten</returns>
Task<IEnumerable<T>> FindSqlAsync(string rawSql, params object[] parameters);
/// <summary>
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
/// </summary>
/// <param name="predicate">Kriterien</param>
/// <returns>Liste gefundener Entitäten</returns>
IQueryable<T> Query(Expression<Func<T, bool>> predicate);
/// <summary>
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen von einem View
/// </summary>
/// <param name="predicate">Kriterien</param>
/// <returns>Liste gefundener Entitäten</returns>
IQueryable<T> QueryView(Expression<Func<T, bool>> predicate);
/// <summary>
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen von einem View
/// </summary>
/// <param name="predicate">Kriterien</param>
/// <returns>Liste gefundener Entitäten</returns>
Task<IEnumerable<T>> QueryViewListAsync(Expression<Func<T, bool>> predicate);
/// <summary>
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen.
/// Hier wird zuerst die SQL-Abfrage ausgeführt!
/// </summary>
/// <param name="rawSql">SQL-String</param>
/// <param name="predicate">Kriterien</param>
/// <returns>Liste gefundener Entitäten</returns>
IQueryable<T> Query(string rawSql, Expression<Func<T, bool>> predicate = null);
/// <summary>
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen.
/// Hier wird zuerst die SQL-Abfrage ausgeführt!
/// </summary>
/// <param name="rawSql">SQL-String</param>
/// <param name="predicate">Kriterien</param>
/// <param name="parameters">Parameter für die Stored Procedure</param>
/// <returns>Liste gefundener Entitäten</returns>
IQueryable<T> QueryStoredProcedure(string rawSql, Expression<Func<T, bool>> predicate = null, params object[] parameters);
/// <summary>
/// Gibt eine Entität oder den Default wert zurück.
/// Wenn mehr als 1 gefunden, dann Exception
/// </summary>
/// <param name="predicate">Kriterien</param>
/// <returns>Gefundene entität oder Default-Wert</returns>
T SingleOrDefault(Expression<Func<T, bool>> predicate);
/// <summary>
/// Gibt eine Entität oder den Default wert zurück.
/// Wenn mehr als 1 gefunden, dann Exception
/// </summary>
/// <param name="predicate">Kriterien</param>
/// <returns>Gefundene entität oder Default-Wert</returns>
Task<T> SingleOrDefaultAsync(Expression<Func<T, bool>> predicate);
/// <summary>
/// Gibt eine Entität oder den Default wert zurück
/// </summary>
/// <param name="predicate">Kriterien</param>
/// <returns>Gefundene entität oder Default-Wert</returns>
T FirstOrDefault(Expression<Func<T, bool>> predicate);
/// <summary>
/// Gibt eine Entität oder den Default wert zurück
/// </summary>
/// <param name="predicate">Kriterien</param>
/// <returns>Gefundene entität oder Default-Wert</returns>
Task<T> FirstOrDefaultAsync(Expression<Func<T, bool>> predicate);
#endregion
#region Add / Hinzufügen
/// <summary>
/// Fügt eine Entität zum Repository hinzu
/// </summary>
/// <param name="entity">Entität</param>
void Add(T entity);
/// <summary>
/// Fügt eine Liste von Entitäten zum Repository hinzu
/// </summary>
/// <param name="entities">List von Entitäten</param>
void AddRange(IEnumerable<T> entities);
#endregion
#region remove / Entfernen
/// <summary>
/// Entfernt eine Entität aus dem Repository
/// </summary>
/// <param name="entity">Zu entfernende Entität</param>
void Remove(T entity);
/// <summary>
/// Entfernt eine Liste von Entitäten aus dem Repository
/// </summary>
/// <param name="entities">Liste von Entitäten</param>
void RemoveRange(IEnumerable<T> entities);
#endregion
#region Count
/// <summary>
/// Gibt die Anzahl aller Entitäten zurück
/// </summary>
/// <returns>Anzahl Entitäten</returns>
int Count();
/// <summary>
/// Gibt die Anzahl aller Entitäten zurück
/// </summary>
/// <returns>Anzahl Entitäten</returns>
Task<int> CountAsync();
/// <summary>
/// Gibt die Anzahl aller Entitäten zurück die definierten Kriterien entsprechen
/// </summary>
/// <param name="predicate">Kriterien</param>
/// <returns>Anzahl Entitäten</returns>
int Count(Expression<Func<T, bool>> predicate);
/// <summary>
/// Gibt die Anzahl aller Entitäten zurück die definierten Kriterien entsprechen
/// </summary>
/// <param name="predicate">Kriterien</param>
/// <returns>Anzahl Entitäten</returns>
Task<int> CountAsync(Expression<Func<T, bool>> predicate);
#endregion
#region Custom
/// <summary>
/// Ausführen eines RAW SQL commands
/// </summary>
/// <param name="sql">SQL-String</param>
/// <param name="parameters">Parameter</param>
/// <returns>Anzahl betroffener Datensätze</returns>
Task<int> ExecuteRawSqlAsync(string sql, Dictionary<string, object> parameters);
#endregion
}
}