using MaBibli.Shared.Entites; namespace MaBibli.Shared.Catalogue; /// /// Filtrage, recherche et tri du catalogue. /// /// /// Écrit sur pour être exécuté par EF Core côté base et /// testable en mémoire sur une simple liste, sans base ni réseau. /// /// La comparaison passe par ToLower() : EF Core la traduit en SQL, et LINQ-to-Objects /// lui donne le même comportement insensible à la casse. Les accents ne sont pas normalisés /// (« Emile » ne trouve pas « Émile ») — limitation assumée à ce stade. /// /// public static class FiltreLivres { public static IQueryable Appliquer(IQueryable source, CritereLivres criteres) { // AUCUN filtre sur AjoutePar : la bibliothèque est commune (CLAUDE.md). // Ce commentaire est là pour qu'une régression future saute aux yeux en relecture. if (criteres.Format is { } format) { source = source.Where(l => l.Format == format); } if (criteres.Statut is { } statut) { source = source.Where(l => l.Statut == statut); } var terme = criteres.Recherche?.Trim(); if (!string.IsNullOrEmpty(terme)) { var recherche = terme.ToLower(); source = source.Where(l => l.Titre.ToLower().Contains(recherche) || (l.Auteur != null && l.Auteur.ToLower().Contains(recherche))); } return Trier(source); } /// /// Tri par titre, puis par identifiant pour rendre l'ordre déterministe. /// /// /// CLAUDE.md ne tranche pas le tri. L'ordre alphabétique a été retenu parce qu'une /// bibliothèque se parcourt par titre ; l'ordre d'ajout n'a d'intérêt que le jour de la saisie. /// public static IQueryable Trier(IQueryable source) => source.OrderBy(l => l.Titre).ThenBy(l => l.Id); }