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 :

Comment faire un IN ("") en LINQ


Sujet :

Linq

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Par défaut Comment faire un IN ("") en LINQ
    Bonjour,

    je voudrais savoir comment faire pour faire une requête linq de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var query1 = SELECT idTABLE1 FROM MATABLE1
                      WHERE id == 1  
     
    var query2 =  SELECT idTABLE2 FROM MATABLE2
                       WHERE idTABLE1 IN (query1)
    J'ai essayé de faire une requête de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    var reqidTABLE1 =        from f in DBcontext.MATABLE1
                                    where f.id == 1
                                    select f.idTABLE1;
     
    var reqidTABLE2 =      from t in DBcontext.MATABLE2
                                  where reqidTABLE1.Contains(t.id)
                                  select fp.idTABLE2;
    Le code compile bien mais je ne récupère pas l'id pour la 2eme requête car cela met une erreur de type :

    LINQ to Entities ne reconnaît pas la méthode «*Boolean Contains[Int32](System.Linq.IQueryable`1[System.Int32], Int32)*», et cette dernière ne peut pas être traduite en expression de magasin."} System.SystemException {System.NotSupportedException}

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Par défaut
    Regarde la classe QueryableExtensions du lien ci-dessous

    http://social.msdn.microsoft.com/for...-b7e4a1ab59f0/

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 44
    Par défaut
    Je viens de voir "LINQ to Entities ne reconnaît pas la méthode..."
    Donc tu bosses avec Entity Framework...
    Faut savoir qu'il y a pas mal d'instructions LINQ qui ne sont pas implémentées dans le framework Entity malheureusement...
    Attention, LINQ est langage de requetage intégré à C# qui ne permet d'interroger que les structures pour lesquelles il existe une implémentation.
    Actuellement on distingue :
    Linq To Object
    Linq To SQL
    Linq To XML
    Linq To Entity (dans ton cas)
    Et probablement d'autres.

  4. #4
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 11
    Par défaut
    Citation Envoyé par matdur Voir le message
    Regarde la classe QueryableExtensions du lien ci-dessous

    http://social.msdn.microsoft.com/for...-b7e4a1ab59f0/
    Oui, c'est la réponse de Colin Meek qu'il faut utiliser en linq to entities

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Par défaut
    Citation Envoyé par Erebuss Voir le message
    Oui, c'est la réponse de Colin Meek qu'il faut utiliser en linq to entities
    En gros, il faut créer la même méthode que lui puis l'appeller ? il n'y a pas d'autres solutions ? parceque j'avoue que je comprends pas tout ce qu'il y a dans la méthode.

  6. #6
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    Je te montre comment je fais:

    tu mets ce code quelque part (ce sont des méthodes d'extension)

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
      public static class QueryableExtensions
        {
            private static Expression<Func<TElement, bool>> GetWhereInExpression<TElement, TValue>(
                Expression<Func<TElement, TValue>> propertySelector, IEnumerable<TValue> values)
            {
                ParameterExpression p = propertySelector.Parameters.Single();
                if (!values.Any())
                    return e => false;
     
                var equals = values.Select(value => (Expression)Expression.Equal(propertySelector.Body, Expression.Constant(value, typeof(TValue))));
                var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal));
     
                return Expression.Lambda<Func<TElement, bool>>(body, p);
            }
     
            public static IQueryable<TElement> WhereIn<TElement, TValue>(
                this IQueryable<TElement> source, Expression<Func<TElement, TValue>> propertySelector, params TValue[] values)
            {
                return source.Where(GetWhereInExpression(propertySelector, values));
            }
     
            public static IQueryable<TElement> WhereIn<TElement, TValue>(
                this IQueryable<TElement> source, Expression<Func<TElement, TValue>> propertySelector, IEnumerable<TValue> values)
            {
                return source.Where(GetWhereInExpression(propertySelector, values));
            }
    Ensuite tu importe ce namespace et tu peux faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaSourceEF.WhereIn(s => s.Champ,new string["toto", "tutu"] )
    ca marche avec d'autres choses que les string évidement

  7. #7
    Membre éprouvé
    Avatar de jgard
    Profil pro
    Inscrit en
    Août 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 67
    Par défaut
    J'ai rencontré le même soucis dans mon projet actuel.
    En fait, Linq ne peut appliquer un Contains sur un type anonyme. Pour faire fonctionner tes requêtes sans utiliser les méthodes d'extensions, tu peux convertir ta méthode comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int[] reqidTABLE1 =      (from f in DBcontext.MATABLE1
                                    where f.id == 1
                                    select f.idTABLE1).ToArray<int>();
     
    var reqidTABLE2 =      from t in DBcontext.MATABLE2.ToList<typeMATABLE2>()
                                  where reqidTABLE1.Contains(t.id)
                                  select fp.idTABLE2;
    J'ai utilisé un array, mais un type List<int> fonctionne aussi. Le plus important en fait est de convertir les données de MATABLE2 en collection "classique".

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