none
Est-il possible de faire des Clauses Where conditionnelles avec EF ?

    Question

  • Bonjour, 

    J'ai dans mon application, une partie qui affiche des entrées d'un log. J'ai ajouté sur mon masque la possibilité de filtrer les entrées du logs, en sélectionnant un ou plusieurs utilisateurs, une ou plusieurs catégories.
    pour l'instant ça fonctionne, mais je trouve le code pas beau... et je cherche à le simplifier.

    Ma question, j'aimerai savoir si il y a un moyen de partir par exemple sur un context de base qui retourne par défaut la totalité, et mettre une condition si j'ai un utilisateur ou plusieurs de sélectionné, tu ajoutes une clause where, même chose pour la catégorie si j'en trouve une ou plusieurs. 

    J'espère que mes explications assez claire ;-)


    voici mon code actuel :

    public static List<MDAOffice_Logs> GetLogList(string _SelectedUsers = null, string _SelectedCategories = null)
    {
        if (_SelectedUsers == null && _SelectedCategories == null)
        {
        // On affiche tout le log  
          using (var context = new MDAOfficeEntities())
          {
              return context.MDAOffice_Logs.Include("Admin_Users")
                     .OrderByDescending(o => o.DateLog).ThenByDescending(o => o.HeureLog)
                     .ToList();
          }
        }
        else if (_SelectedUsers != null && _SelectedCategories == null)
        {
        // On affiche les entrées pour un ou plusieurs utilisateurs de sélectionnés 
          int[] findUser = _SelectedUsers.Split(',').Select(int.Parse).ToArray();
          using (var context = new MDAOfficeEntities())
          {
              return context.MDAOffice_Logs.Include("Admin_Users")
                     .Where(f => findUser.Any(s => f.Id_User.Equals(s)))
                     .OrderByDescending(o => o.DateLog).ThenByDescending(o => o.HeureLog)
                     .ToList();
          }
        }
        else if (_SelectedUsers != null && _SelectedCategories != null && _DateOperationFilter == null)
        {
        // On affiche un ou plusieurs utilisateurs et une ou plusieurs catégories de sélectionnées 
          int[] findUser = _SelectedUsers.Split(',').Select(int.Parse).ToArray();
          string[] findCategorie = _SelectedCategories.Split(';');
          using (var context = new MDAOfficeEntities())
            {
                return context.MDAOffice_Logs.Include("Admin_Users")
                       .Where(f => findCategorie.Any(s => f.Categorie.Contains(s)))
                       .Where(f => findUser.Any(s => f.Id_User.Equals(s)))
                       .OrderByDescending(o => o.DateLog).ThenByDescending(o => o.HeureLog)
                       .ToList();
            }
        }
        else if (_SelectedUsers == null && _SelectedCategories != null)
        {
        // On affiche les entrées pour une ou plusieurs catégories de sélectionnées 
          string[] findCategorie = _SelectedCategories.Split(';');
          using (var context = new MDAOfficeEntities())
          {
              return context.MDAOffice_Logs.Include("Admin_Users")
                     .Where(f => findCategorie.Any(s => f.Categorie.Contains(s)))
                     .OrderByDescending(o => o.DateLog).ThenByDescending(o => o.HeureLog)
                     .ToList();
          }
        }
        else
        {
          return null;
        }   
    }

    Le pire c'est que j'aimerai ajouté par la suite, la possibilité de filtrer sur les dates également, et si je pars sur mon code actuel, il va faire 300 km de long en testant toutes les possibilités (je précise que je débute, c'est ma première application). 

    Merci pour votre aide.

    Alex

    mardi 20 février 2018 00:33