IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linq Discussion :

Condition si champs remplis, sinon sélectionner tout


Sujet :

Linq

  1. #1
    Membre régulier Avatar de miniil
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 267
    Points : 76
    Points
    76
    Par défaut Condition si champs remplis, sinon sélectionner tout
    Bonjour,

    Je tente d'effectuer une requête Linq avec une condition : Si un champs dans mon formulaire est rempli alors on l'applique pour filtrer les résultats sinon on sélectionne tout.

    J'ai une table de personnes avec date de naissance. Si on fait une recherche sur la date de naissance, j'aimerai que le résultat soit la liste des personnes ayant la même date de naissance. Si le champs est laissé vide on sélection tout. (Remarque : Il y a d'autres champs de recherche également Nom, Prénom, etc).

    Ce que j'avais imaginé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var people = from p in context.DB_PEOPLE
                                where (!filterBirthDate.Text.Equals("")? p.BIRTHDATE == filterBirthDate : ???)
                                select new
                                {
                                   p.NOM,
                                   p.PRENOM
                                };
    Je ne sais pas que mettre à droite du : pour dire sinon on sélectionne tout.

    Pouvez-vous m'aider?

    D'avance merci.
    miniil

  2. #2
    Membre confirmé Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2015
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2015
    Messages : 270
    Points : 461
    Points
    461
    Par défaut
    Salut ,

    Le "je sélectionne tout" c'est le fait de ne rien avoir dans la clause where il me semble .

    tu as essayé avec String.Empty ou "" dans ton ternaire ?
    throw new NoSignatureException();

  3. #3
    Membre régulier Avatar de miniil
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 267
    Points : 76
    Points
    76
    Par défaut
    Oui j'avais essayé mais erreur de compilation : Impossible de convertir String en Bool

    En effet la condition p.BIRTHDATE == filterBirthDate c'est booléen.
    miniil

  4. #4
    Membre confirmé Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2015
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2015
    Messages : 270
    Points : 461
    Points
    461
    Par défaut
    Ha oui pardon

    Je marche sur des œufs , tu peux essayer (bool?)null . L'interêt serai de trouver l'équivalent de NVL en sql , en linq .

    j'aurais testé différentes chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    where (!filterBirthDate.Text.Equals("")? p.BIRTHDATE == filterBirthDate : (bool?)null)
     
    where (!filterBirthDate.Text.Equals("")? p.BIRTHDATE == filterBirthDate : false)  //la valeur par défaut d'un bool
    note : si ton filterBirthDate est un control tu doit aussi mettre .Text dans la condition p.BIRTHDATE == filterBirthDate.Text

    Désolé de pas avoir le temps de tester de mon coté .
    throw new NoSignatureException();

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Points : 1 511
    Points
    1 511
    Par défaut
    Bonjour,

    t'as clause where pourrait être =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    !filterBirthDate.Text.Equals("")? p.BIRTHDATE == filterBirthDate : p.BIRTHDATE >= DateTime.MinValue
    Ou alors tu fait 2 requêtes linq ... à toi de voir.

    Bon code,
    J@ck.
    Pas de réponse par MP, merci.

    Penser au ça fait plaisir

  6. #6
    Membre régulier Avatar de miniil
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 267
    Points : 76
    Points
    76
    Par défaut
    Je viens d'essayer plusieurs possibilités :

    (bool?)null => Cast impossible à la compilation

    Mettre 1=1, true, false, dans mon opérateur ternaire mais là j'ai un autre problème qui vient du fait que je ne veux prendre que la partie date d'un DateTime.

    Donc, je fais un cast de mon champs de formulaire : var datenais = DateTime.Parse(filterBirthDate)

    et ensuite dans ma requête Linq :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var people = from p in context.DB_PEOPLE
                                where (!filterBirthDate.Text.Equals("")? System.Data.Entity.DbFunctions.TruncateTime(p.BIRTHDATE) == datenais : true)
                                select new
                                {
                                   p.NOM,
                                   p.PRENOM
                                };
    Mais j'obtiens l'erreur suivante à l'exécution :

    La méthode 'System.Nullable`1[System.DateTime] TruncateTime(System.Nullable`1[System.DateTime])' ne prend pas en charge la traduction en SQL.

    Au moment de faire

    foreach (var item in people)
    {
    }

    REM : La ± même utilisation dans un formulaire de recherche avec un queryextender sur un datasource ne provoque pas la même erreur. Ici, je veux exporter les résultats de la recherche vers un fichier excel et la seule méthode que j'avais trouvée était de refaire la requête de recherche et de créer une DataTable avec les résultats.

    J'espère que je m'explique bien
    miniil

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Points : 1 511
    Points
    1 511
    Par défaut
    Citation Envoyé par miniil Voir le message
    Mettre 1=1, true, false, dans mon opérateur ternaire mais là j'ai un autre problème qui vient du fait que je ne veux prendre que la partie date d'un DateTime.
    )
    La composante Date d'un DateTime est directement accessible par sa propriété .Date

    Je ne sais pas de quel type est filterBirthDate, mais si j'étais toi je bosserais avec des DateTime puisque tu veux comparer des dates. Donc en partant du principe que filterBirthDate est une textBox et donc que filterBirthDate.Text te retourne la date dans un string. Je considère également que p.BIRTHDATE est un DateTime (au pire Convert.ToDateTime nous aidera)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DateTime dtNais = string.IsNullOrEmpty(filterBirthDate.Text.Trim()) ? DateTime.MinValue : Convert.ToDateTime(filterBirthDate.Text.Trim()) ; //on est d'accord que tu auras fait ce test de conversion avant, afin de vérifier la saisie.
    var people = from p in context.DB_PEOPLE
                                where (dtNais == DateTime.MinValue OR dtNais.Date == p.BIRTHDATE.Date )
                                select new
                                {
                                   p.NOM,
                                   p.PRENOM
                                };

    J@ck.
    Pas de réponse par MP, merci.

    Penser au ça fait plaisir

  8. #8
    Membre régulier Avatar de miniil
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 267
    Points : 76
    Points
    76
    Par défaut
    Impossible de faire p.BIRTHDATE.Date

    BirthDate étant pourtant bien de type DateTime dans une DB MSSQL.
    miniil

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Points : 1 511
    Points
    1 511
    Par défaut
    Nikel alors !
    Comme dis plus haut un petit coup de Convert.ToDatetime nous donnera =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DateTime dtNais = string.IsNullOrEmpty(filterBirthDate.Text.Trim()) ? DateTime.MinValue : Convert.ToDateTime(filterBirthDate.Text.Trim()) ; //on est d'accord que tu auras fait ce test de conversion  avant, afin de vérifier la saisie.
    var people = from p in context.DB_PEOPLE
                                where (dtNais == DateTime.MinValue OR dtNais.Date == Convert.ToDateTime(p.BIRTHDATE).Date )
                                select new
                                {
                                   p.NOM,
                                   p.PRENOM
                                };
    Bon code,
    J@ck.
    Pas de réponse par MP, merci.

    Penser au ça fait plaisir

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur Full-stack
    Inscrit en
    Novembre 2010
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Full-stack

    Informations forums :
    Inscription : Novembre 2010
    Messages : 372
    Points : 489
    Points
    489
    Par défaut
    Bonjour,
    Merci d'essayer ce code et me faire un retour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    if (!string.IsNullOrEmpty(filterBirthDate.Text.Trim()))//Vérifier si c'est une date
    {
    var people=( from p in context.DB_PEOPLE
                                where  p.BIRTHDATE == filterBirthDate.Text.Trim()
                                select new
                                {
                                   p.NOM,
                                   p.PRENOM
                                })).ToList();// Il serait bon de lever cette restriction (select new...) et la remplacer par "select p"
     
    }
    else
    {
    var people = context.DB_PEOPLE.ToList();
     
    }
    Merci.
    La recherche de la connaissance est une Lumière qui apaise le Cœur.
    Si une réponse vous a été utile , n'oubliez pas de voter en cliquant sur:.

Discussions similaires

  1. [MySQL] Sélectionner toutes les valeurs d'un champs
    Par Seelass dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 19/09/2012, 13h16
  2. sélectionner toutes les valeurs possibles d'un champs
    Par _developpeur_ dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 22/10/2007, 18h32
  3. Renommer un champ et changement dans toute la base ...
    Par snoopy69 dans le forum Access
    Réponses: 4
    Dernier message: 19/04/2006, 10h19
  4. test champ rempli
    Par masseur dans le forum Langage
    Réponses: 12
    Dernier message: 09/12/2005, 13h58
  5. Avoir un champ qui se decremente tout seul
    Par romeo9423 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 15/02/2005, 04h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo