using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using gehGassi.Core.Interfaces;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
namespace gehGassi.Persistence
{
///
/// Abstrakte Basis-Klasse für Repositories
///
/// Typ (Klasse) des Repositories
public class Repository : IRepository where T : class
{
private readonly DbContext _context;
private readonly DbSet _entities;
///
/// Erstellt eine Instanz
///
/// Instanz eines DBContext
public Repository(DbContext context)
{
_context = context;
_entities = _context.Set();
}
///
/// Gibt eine Entität anhand der eindeutigen Id zurück
///
/// Id der Entität
/// Entität oder null, wenn nicht gefunden
public virtual T Get(object id)
{
return _entities.Find(id);
}
///
/// Gibt eine Entität anhand der eindeutigen Id zurück
///
/// Id der Entität
/// Entität oder null, wenn nicht gefunden
public virtual async Task GetAsync(object id)
{
return await _entities.FindAsync(id);
}
///
/// Gibt alle Entitäten zurück
///
/// Liste aller Entitäten
public virtual IEnumerable GetAll()
{
return _entities.ToList();
}
///
/// Gibt alle Entitäten zurück
///
/// Liste aller Entitäten
public virtual async Task> GetAllAsync()
{
return await _entities.ToListAsync();
}
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
///
/// Kriterien
/// Liste gefundener Entitäten
public virtual IEnumerable Find(Expression> predicate)
{
return _entities.Where(predicate).ToList();
}
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
///
/// Kriterien
/// Liste gefundener Entitäten
public virtual async Task> FindAsync(Expression> predicate)
{
return await _entities.Where(predicate).ToListAsync();
}
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
///
/// Kriterien
/// Liste gefundener Entitäten
public virtual async Task> FindNoTrackingAsync(Expression> predicate)
{
return await _entities.Where(predicate).AsNoTracking().ToListAsync();
}
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen.
/// Hier wird zuerst die SQL-Abfrage ausgeführt!
///
/// SQL-String
/// Kriterien
/// Liste gefundener Entitäten
public IEnumerable Find(string rawSql, Expression> predicate = null)
{
var result = _entities.FromSqlRaw(rawSql);
if (predicate != null)
result = result.Where(predicate);
return result.ToList();
}
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
/// Hier wird zuerst die SQL-Abfrage ausgeführt!
///
/// SQL-String
/// Kriterien
/// Liste gefundener Entitäten
public async Task> FindAsync(string rawSql, Expression> predicate = null)
{
var result = _entities.FromSqlRaw(rawSql);
if (predicate != null)
result = result.Where(predicate);
return await result.ToListAsync();
}
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
/// Hier wird zuerst die SQL-Abfrage ausgeführt!
///
/// SQL-String
/// SQL-Parameter
/// Liste gefundener Entitäten
public async Task> FindSqlAsync(string rawSql, params object[] parameters)
{
var result = _entities.FromSqlRaw(rawSql, parameters);
return await result.ToListAsync().ConfigureAwait(false);
}
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen
///
/// Kriterien
/// Liste gefundener Entitäten
public IQueryable Query(Expression> predicate)
{
return _entities.Where(predicate);
}
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen von einem View
///
/// Kriterien
/// Liste gefundener Entitäten
public IQueryable QueryView(Expression> predicate)
{
return _context.Set().Where(predicate);
}
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen von einem View
///
/// Kriterien
/// Liste gefundener Entitäten
public async Task> QueryViewListAsync(Expression> predicate)
{
return await _context.Set().Where(predicate).ToListAsync();
}
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen.
/// Hier wird zuerst die SQL-Abfrage ausgeführt!
///
/// SQL-String
/// Kriterien
/// Liste gefundener Entitäten
public IQueryable Query(string rawSql, Expression> predicate = null)
{
var result = _entities.FromSqlRaw(rawSql);
if (predicate != null)
result = result.Where(predicate);
return result;
}
///
/// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen.
/// Hier wird zuerst die SQL-Abfrage ausgeführt!
///
/// SQL-String
/// Kriterien
/// Parameter für die Stored Procedure
/// Liste gefundener Entitäten
public IQueryable QueryStoredProcedure(string rawSql, Expression> predicate = null, params object[] parameters)
{
var result = _entities.FromSqlRaw(rawSql, parameters);
if (predicate != null)
result = result.Where(predicate);
return result;
}
///
/// Gibt eine Entität oder den Default wert zurück
///
/// Kriterien
/// Gefundene entität oder Default-Wert
public virtual T SingleOrDefault(Expression> predicate)
{
return _entities.SingleOrDefault(predicate);
}
///
/// Gibt eine Entität oder den Default wert zurück
///
/// Kriterien
/// Gefundene entität oder Default-Wert
public virtual async Task SingleOrDefaultAsync(Expression> predicate)
{
return await _entities.SingleOrDefaultAsync(predicate);
}
///
/// Gibt eine Entität oder den Default wert zurück
///
/// Kriterien
/// Gefundene entität oder Default-Wert
public T FirstOrDefault(Expression> predicate)
{
return _entities.FirstOrDefault(predicate);
}
///
/// Gibt eine Entität oder den Default wert zurück
///
/// Kriterien
/// Gefundene entität oder Default-Wert
public async Task FirstOrDefaultAsync(Expression> predicate)
{
return await _entities.FirstOrDefaultAsync(predicate);
}
///
/// Fügt eine Entität zum Repository hinzu
///
/// Entität
public virtual void Add(T entity)
{
_entities.Add(entity);
}
///
/// Fügt eine Liste von Entitäten zum Repository hinzu
///
/// List von Entitäten
public virtual void AddRange(IEnumerable entities)
{
_entities.AddRange(entities);
}
///
/// Entfernt eine Entität aus dem Repository
///
/// Zu entfernende Entität
public virtual void Remove(T entity)
{
_entities.Remove(entity);
}
///
/// Entfernt eine Liste von Entitäten aus dem Repository
///
/// Liste von Entitäten
public virtual void RemoveRange(IEnumerable entities)
{
_entities.RemoveRange(entities);
}
///
/// Gibt die Anzahl aller Entitäten zurück
///
/// Anzahl Entitäten
public int Count()
{
return _entities.Count();
}
///
/// Gibt die Anzahl aller Entitäten zurück
///
/// Anzahl Entitäten
public async Task CountAsync()
{
return await _entities.CountAsync();
}
///
/// Gibt die Anzahl aller Entitäten zurück die definierten Kriterien entsprechen
///
/// Kriterien
/// Anzahl Entitäten
public int Count(Expression> predicate)
{
return _entities.Count(predicate);
}
///
/// Gibt die Anzahl aller Entitäten zurück die definierten Kriterien entsprechen
///
/// Kriterien
/// Anzahl Entitäten
public async Task CountAsync(Expression> predicate)
{
return await _entities.CountAsync(predicate);
}
///
/// Ausführen eines RAW SQL commands
///
/// SQL-String
/// Parameter
/// Anzahl betroffener Datensätze
public async Task ExecuteRawSqlAsync(string sql, Dictionary parameters)
{
var sqlParameters = new List();
foreach (var (key, value) in parameters)
{
sqlParameters.Add(new SqlParameter(key, value));
}
return await _context.Database.ExecuteSqlRawAsync(sql, sqlParameters);
}
}
}