using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace gehGassiApp.Core.Data
{
///
/// Schnittstellenbeschreibung für ein generisches Repository.
/// Speichern von Änderungen wird über das UnitOfWork-Pattern durchgeführt.
///
/// Typ des Repository
public interface IRepository where T : class
{
#region Get / Abfragen
///
/// Gibt eine Entität anhand der eindeutigen Id zurück.
/// Verwendet Find - NoTracking nicht möglich
///
/// Id der Entität
/// Entität oder null, wenn nicht gefunden
T Get(object id);
///
/// Gibt eine Entität anhand der eindeutigen Id zurück
/// Verwendet Find - NoTracking nicht möglich
///
/// Id der Entität
/// Entität oder null, wenn nicht gefunden
Task GetAsync(object id);
///
/// Gibt alle Entitäten zurück
///
/// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten
/// Liste aller Entitäten
IEnumerable GetAll(bool noTracking = true);
///
/// Gibt alle Entitäten zurück
///
/// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten
/// Liste aller Entitäten
Task> GetAllAsync(bool noTracking = true);
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
///
/// Kriterien
/// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten
/// Liste gefundener Entitäten
IEnumerable Find(Expression> predicate, bool noTracking = true);
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
///
/// Kriterien
/// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten
/// Liste gefundener Entitäten
Task> FindAsync(Expression> predicate, bool noTracking = true);
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen mit Sortierung und Skip und Take für Paging
///
/// Kriterien
/// Sortierung
/// Anzahl Datensätze auslassen
/// Anzahl Datensätze selektieren
/// true wenn Sortierung aufsteigend, false sonst
/// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten
/// Liste gefundener Entitäten
Task> FindAsync(Expression> predicate, Expression> orderBySelector, int skip, int take, bool ascending, bool noTracking = true);
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen.
/// Hier wird zuerst die SQL-Abfrage ausgeführt!
///
/// SQL-String
/// Kriterien
/// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten
/// Liste gefundener Entitäten
IEnumerable Find(string rawSql, Expression> predicate = null, bool noTracking = true);
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
/// Hier wird zuerst die SQL-Abfrage ausgeführt!
///
/// SQL-String
/// Kriterien
/// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten
/// Liste gefundener Entitäten
Task> FindAsync(string rawSql, Expression> predicate = null, bool noTracking = true);
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
///
/// Kriterien
/// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten
/// Liste gefundener Entitäten
IQueryable Query(Expression> predicate, bool noTracking = true);
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen von einem View
///
/// Kriterien
/// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten
/// Liste gefundener Entitäten
IQueryable QueryView(Expression> predicate, bool noTracking = true);
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen von einem View
///
/// Kriterien
/// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten
/// Liste gefundener Entitäten
Task> QueryViewListAsync(Expression> predicate, bool noTracking = true);
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen.
/// Hier wird zuerst die SQL-Abfrage ausgeführt!
///
/// SQL-String
/// Kriterien
/// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten
/// Liste gefundener Entitäten
IQueryable Query(string rawSql, Expression> predicate = null, bool noTracking = true);
///
/// Gibt eine Entität oder den Default wert zurück
///
/// Kriterien
/// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten
/// Gefundene entität oder Default-Wert
T SingleOrDefault(Expression> predicate, bool noTracking = true);
///
/// Gibt eine Entität oder den Default wert zurück
///
/// Kriterien
/// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten
/// Gefundene entität oder Default-Wert
Task SingleOrDefaultAsync(Expression> predicate, bool noTracking = true);
///
/// Gibt eine Entität oder den Default wert zurück
///
/// Kriterien
/// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten
/// Gefundene entität oder Default-Wert
Task FirstOrDefaultAsync(Expression> predicate, bool noTracking = true);
#endregion
#region Add / Hinzufügen
///
/// Fügt eine Entität zum Repository hinzu
///
/// Entität
void Add(T entity);
///
/// Fügt eine Liste von Entitäten zum Repository hinzu
///
/// List von Entitäten
void AddRange(IEnumerable entities);
#endregion
#region Update
///
/// Aktualisieren einer Entität
///
/// Entität
void Update(T entity);
///
/// Aktualisieren einer Liste von Entitäten
///
/// List von Entitäten
void UpdateRange(IEnumerable entities);
#endregion
#region remove / Entfernen
///
/// Entfernt eine Entität aus dem Repository
///
/// Zu entfernende Entität
void Remove(T entity);
///
/// Entfernt eine Liste von Entitäten aus dem Repository
///
/// Liste von Entitäten
void RemoveRange(IEnumerable entities);
#endregion
#region Count
///
/// Gibt die Anzahl aller Entitäten zurück
///
/// Anzahl Entitäten
int Count();
///
/// Gibt die Anzahl aller Entitäten zurück
///
/// Anzahl Entitäten
Task CountAsync();
///
/// Gibt die Anzahl aller Entitäten zurück die definierten Kriterien entsprechen
///
/// Kriterien
/// Anzahl Entitäten
int Count(Expression> predicate);
///
/// Gibt die Anzahl aller Entitäten zurück die definierten Kriterien entsprechen
///
/// Kriterien
/// Anzahl Entitäten
Task CountAsync(Expression> predicate);
#endregion
#region Custom
///
/// Ausführen eines RAW SQL commands
///
/// SQL-String
/// Parameter
/// Anzahl betroffener Datensätze
Task ExecuteRawSqlAsync(string sql, object[] parameters);
#endregion
}
}