using System.Linq.Expressions; using Microsoft.EntityFrameworkCore; namespace adas_core.Domain; /// /// Allow to pass to a /// multiple requests like: /// * Include (to fetch eagerly relations inside T entity) /// Use a Builder pattern. /// /// /// var queryCustomizer = QueryCustomizer<Video>.New() /// .Include(v => v.Room) /// .Include(v => v.Clips) /// .Include(v => v.Diagnosis) /// .Include(v => v.Movies) /// .Include(v => v.Patient) /// .Include(v => v.Service) /// .Include(v => v.Thumbnail) /// .Include(v => v.VideoDoctors) /// .Include(v => v.Procedure) /// .Include(v => v.Recordings) /// .Include(v => v.Chapters) /// .Include(v => v.LogDownloadVideoUsers) /// .Include("VideoDoctors.Doctor") /// ; /// var v = _videoRepository.GetById(id, queryCustomizer); /// /// /// public class QueryCustomizer where T : class { private readonly List>> _includeLinqExpressions = []; private readonly List _includeLinqStringExpressions = []; public static QueryCustomizer New() { return new QueryCustomizer(); } public QueryCustomizer Include(Expression> includeExpression) { _includeLinqExpressions.Add(includeExpression); return this; } public QueryCustomizer Include(params Expression>[] includeExpressions) { _includeLinqExpressions.AddRange(includeExpressions); return this; } public QueryCustomizer Include(string includeExpression) { _includeLinqStringExpressions.Add(includeExpression); return this; } public QueryCustomizer Include(params string[] includeExpressions) { _includeLinqStringExpressions.AddRange(includeExpressions); return this; } public IQueryable AddToQueryable(IQueryable queryable) { var resultQueryable = queryable; resultQueryable = _includeLinqExpressions .Aggregate(resultQueryable, (current, expression) => current.Include(expression)) ; resultQueryable = _includeLinqStringExpressions .Aggregate(resultQueryable, (current, expression) => current.Include(expression)) ; return resultQueryable; } }