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 :

Requête IQueryable typée


Sujet :

Linq

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 256
    Points : 70
    Points
    70
    Par défaut Requête IQueryable typée
    Bonjour,

    J'essaye de me mettre dans le linq to entity Framework, j'ai un soucis sur une requête avec une jointure.

    Voici l'EDM :

    Uploaded with ImageShack.us

    et Voici la requete :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     public IQueryable<TypeAnimalStock> GetStockByTypeAnimal(int idTypeAnimal)
            {
              var requete = from sto in _entities.Stocks
                              from typAnimSto in sto.TypeAnimalStock
                              where typAnimSto.idTypeAnimal == idTypeAnimal
                              select new { sto, typAnimSto };
     
                return requete;
            }

    J'ai l'erreur
    Impossible de convertir implicitement le type 'System.Linq.IQueryable<AnonymousType#1>' en 'System.Linq.IQueryable<GestionPacha.Data.TypeAnimalStock>'. Une conversion explicite existe (un cast est-il manquant*?)
    Je dois récupéré le contenu des tables Stock et TypeAnimalStock mais je n'arrive pas à comprendre ce qui ne va pas...

    Merci de votre aide

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    La raison de l'erreur est ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select new { sto, typAnimSto }
    La requête LINQ retourne une IEnumerable d'un tuple (anonyme a cause du simple new) de Stock et TypeAnimalStock.

    D'autre part, je m'interroge sur le nom de la méthode "GetStockByTypeAnimal" ne devrait-elle pas plutôt retourner un IQueryable<Stock> ou un IEnumrable<Stock>

    Dans le même ordre d'idée, LINQ a pour but de faire du requetage sur des objets. On peut donc passer outre le coté Relationel. Avec quelques chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public IQueryable<TypeAnimalStock> GetStockByTypeAnimal(TypeAnimal typeAnimal)
    {
    var requete = from sto in _entities.Stocks
    where sto.TypeAnimaStock.TypeAnimal == typeAnimal;
     
    return requete;
    }

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 256
    Points : 70
    Points
    70
    Par défaut
    Merci de ta réponse rapide, quand je fais comme tu dis, j'ai une erreur au niveau de TypeAnimal

    var requete = from sto in _entities.Stocks
    where sto.TypeAnimalStock.TypeAnimal == typeAnimal;

    Il ne le reconnait pas ? Je ne comprend pas pourquoi ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Effectivement c'est de ma faute, j'ai raté la liaison 1-n.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var requête = from sto in _entities.Stocks
    from typAnimSto in sto.TypeAnimalStock
    where typAnimSto.TypeAnimal == typeAnimal
    select sto; //ou select typAnimSto;
    En gros ce que je voulais dire c'est que tu n'as pas besoin de tester via la clé primaire. C'est le boulot d'Entity Framework de s'assurer que 2 instances de TypeAnimal sont égal si elles ont la même clé primaire.

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 256
    Points : 70
    Points
    70
    Par défaut
    Ok sa marche nikel, j'ai un peu de mal, je fait toujours référence au modèle relationnel quand je fais mes requêtes linq.

    Merci encore

  6. #6
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 256
    Points : 70
    Points
    70
    Par défaut
    Petite question que je ne comprend pas :

    Cette requete fonctionne bien :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public DateTime GetMaxDate(int idTypeAnimal)
            {
                    var requete = (from typAnimSto in _entities.TypeAnimalStocks
                                   where idTypeAnimal ==     typAnimSto.TypeAnimal.idTypeAnimal 
                                   select typAnimSto.dateRemplissage).Max();
     
                return requete;
            }

    Et celle-ci me renvoit :

    Impossible de créer une valeur constante de type «*GestionPacha.Data.TypeAnimal*». Seuls les types primitifs («*par exemple Int32, String et Guid*») sont pris en charge dans ce contexte.
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public DateTime GetMaxDate(TypeAnimal typeAnimal)
            {
                var requete = (from typAnimSto in _entities.TypeAnimalStocks
                               where typeAnimal == typAnimSto.TypeAnimal 
                               select typAnimSto.dateRemplissage).Max();
     
                return requete;
            }


    pourquoi ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    J'avoue que je vois pas pourquoi.
    Tu peux donnée le numéro de l'erreur de compilation, ou le type d’exception?
    Quel est la version du Framework avec laquelle tu travail?

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 256
    Points : 70
    Points
    70
    Par défaut
    Je travail avec la version 4 niveau Framework, voici le détail de l'erreur :

    System.Windows.Markup.XamlParseExeception

    Message : L'invocation du constructeur sur le type 'GestionPacha.MainWindow' qui correspond aux contraintes de liaison spécifiées a levé une exception.' numéro de ligne '4' et position de ligne '9'.
    StackTrace :
    à System.Data.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter parent, ConstantExpression linq)
    à System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
    à System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
    à System.Data.Objects.ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq)
    à System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
    à System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
    à System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input)
    à System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding)
    à System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)
    à System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
    à System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
    à System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
    à System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
    à System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
    à System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)
    à System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SelectTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
    à System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
    à System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
    à System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
    à System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
    à System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.AggregateTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
    à System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
    à System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
    à System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
    à System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
    à System.Data.Objects.ELinq.ExpressionConverter.Convert()
    à System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
    à System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
    à System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
    à System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
    à System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__3[TResult](IEnumerable`1 sequence)
    à System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot)
    à System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression)
    à System.Linq.Queryable.Max[TSource](IQueryable`1 source)
    à GestionPacha.Model.DataAccessService.GetMaxDate(TypeAnimal typeAnimal) dans G:\WPF\GestionPacha\GestAMIPacha\GestAMIPacha\Model\DataAccessService.cs:ligne 84
    à GestionPacha.ViewModel.MainWindowViewModel..ctor(IDataAccessService dataService) dans G:\WPF\GestionPacha\GestAMIPacha\GestAMIPacha\ViewModel\MainWindowViewModel.cs:ligne 38
    à GestionPacha.MainWindow..ctor() dans G:\WPF\GestionPacha\GestAMIPacha\GestAMIPacha\View\MainWindow.xaml.cs:ligne 18

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    J'ai du effectué quelques test pour comprendre ton problème.
    En gros j'ai réussi à le reproduire, après avoir bien isolé la cause qui viens du where.
    J'ai cherché à savoir d'où cela venait, de Linq, de Linq to Entity, de ton entité, du provider ?

    Du coup premier test, verifier la presence de l'exception en mode Linq to Object. Elle n'y est pas. Ca ne viens pas de Linq.
    Deuxième test une recherche du Max sur l'entité avec un bon vieux foreach
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    max = DateTime.MinValue;
                    foreach (TypeAnimalStock typeAnimalStock in entities.TypeAnimalStocks)
                    {
                        if (typeAnimalStock.TypeAnimal != typeAnimal)
                            continue;
                        if (typeAnimalStock.DateRemplissage > max)
                            max = typeAnimalStock.DateRemplissage;
                    }
                    Console.WriteLine("Foreach Max : {0}", max);
    Entity fait bien sont travaille sur les condition d’égalité.

    Pour moi le problème viens de "Linq to Entity", en cherchant je suis tombé sur ca

    Il reste à savoir si cela viens de Linq to Entity seul, ou du couplage avec le provider de la base de données. Dans mon cas j'ai utilisé SqlServer Compact.

  10. #10
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    c'est normale que ta requête ne fonctionne pas :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public DateTime GetMaxDate(TypeAnimal typeAnimal)
    {
        var requete = (from typAnimSto in _entities.TypeAnimalStocks
                where typeAnimal == typAnimSto.TypeAnimal
                select typAnimSto.dateRemplissage).Max();
     
        return requete;
    }
    (Ligne 4)

    puisque tu compares deux références de classe et non pas un type primitif.
    dans ce cas il faut que tu surcharge dans ta classe l’opérateur ==.
    Jette un coup d’œil sur ce lien http://www.ikriv.com/dev/dotnet/objectequality.html

    j'espère que ça va t'aider

Discussions similaires

  1. [MySQL] Connaitre le nombre de "rows" dans une requête de type SELECT ?
    Par dagra dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 15/11/2006, 22h44
  2. requête SQL : Type incompatible
    Par Bertr@nd dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 20/06/2006, 11h44
  3. [MySQL] Affichage page par page et requêtes du type $sql .=
    Par carelha dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 06/04/2006, 17h12
  4. Réponses: 2
    Dernier message: 02/03/2006, 11h57
  5. [PHP MySQL] Erreur execution requête de type INSERT
    Par Pfeffer dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/01/2006, 17h38

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