none
Conversion résultat de requete LINQ RRS feed

  • Question

  • Bonjour,

    Interrogant une base access via le code ci dessous

    
          DataSet ds;
        
      
          OdbcCommand requete;
          OdbcConnection ctnAccess;
          
          OdbcDataAdapter adapter;
    
    
          ctnAccess = new OdbcConnection();
          ctnAccess.ConnectionString = "Driver={Microsoft Access Driver (*.mdb)};Dbq=" + "C:\\test\\RepEx.mdb";
          requete = new OdbcCommand();
          ds = new DataSet();
          adapter = new OdbcDataAdapter();
    
          requete.Connection = ctnAccess;
    
          //Importation de la table article
    
          ctnAccess.Open();
    
          
    
          //Recherche de tout les codes d'article & Importation de la table entière
          requete.CommandText = ("SELECT * FROM article WHERE 1 ORDER BY Code");
    
          
    
    
          adapter.SelectCommand = requete;
          adapter.Fill(ds, "Article");
    
          ctnAccess.Close();
    
         
          var aaa = (from DataRow dr in ds.Tables["Article"].Rows
                where (string)dr["Code"] == "001374I"
               select (bool)dr["ArticleProduction"]);

    Je me retrouve avec un résultat "true" ou "false" suivant l'article voulu et j'aimerai faire des tests basiques dessus.

    Or impossible de convertir le résultat de cette requête en quelque chose d'exploitable ou d'en faire un "if (aaa==true)" ou "if (aaa.Equals(true))"

    Existe t'il une façon de faire simple que je connais pas?

    Merci avance

     

    mardi 4 mai 2010 15:52

Réponses

  • Bon, le LINQ est assez nouveau pour moi mais j'en suis arrivé à un résultat qui marche
          var aaa = (from DataRow dr in ds.Tables["Article"].Rows
                where (string)dr["Code"] == "001374I"
                select dr).ToList();
    
          bool resultat;
    
          foreach (DataRow p in aaa)
          {
            resultat = (p.Field<bool>("ArticleProduction"));
    
          }
    C'est peut être possible ou pas de réduire le code mais en tout cas, je peux faire des tests dessus simplement maintenant...
    • Marqué comme réponse lansing-2009 jeudi 6 mai 2010 09:19
    mercredi 5 mai 2010 09:31

Toutes les réponses

  • Bonjour,

    pour effectuer des requêtes Linq sur des dataset il est utile d'utiliser LinqToDataset.

    Pour cela ajouter au projet une référence à : System.Data.DataSetExtension

    Cela permet alors d'utiliser la méthode d'extension AsEnumerable sur la table.

     

    D'après votre exemple on peut alors écrire la requête ci dessous :

     

    bool check = ds.Tables["Article"].AsEnumerable().Any( dr => dr.Field<string>("Code") == "001374I" );

     

    Cordialement

     

    mardi 4 mai 2010 17:09
    Modérateur
  • C'est une façon d'utiliser LINQ que je ne connais pas, par contre où mettre le "select articleproduction" la dedans ?
    mercredi 5 mai 2010 08:17
  • Dans l'exemple que je vous ai donné vous n'avez pas à utiliser de where. Cela dépend du test que vous cherchez à effectuer et de vos données.

    La méthode Any vous permet de tester si sur la table article il y a bien au moins une ligne pour laquelle le champ code vaut 001374I.

    La méthode retournera alors directement true ou false.

    Cette méthode attend en paramétre un prédicat c'est à dire une méthode retournant un booléen qui sera exécutée pour chaque DataRow présent dans la datatable

    C'est ici que vous pouvez réaliser votre test d'ou la condition sous forme d'expression lambda :

     

    dr => dr.Field<string>("Code") == "001374I"

     

    Maintenant si vous utilisez un Where vous obtiendrez en retour une collection de DataRow. Dans ce cas il faut effectuer une projection ( via un appel à la méthode ToList par exemple ) pour effectivement effectuer la requête linq :

     

    var list = ds.Tables["Article"].AsEnumerable().Where(dr => dr.Field<string>("Code") == "001374I").ToList();

     

    Cette syntaxe est équivalente à cette requête plus proche de votre exemple :

     

    var listbis = (from articles in table.AsEnumerable() 
         where articles.Field<string>("Code") == "001374I"
         select articles).ToList();

     

    Dans ce cas vous recupérer une liste d'article pour lequel le code vaut 001374I

    Vous pouvez naturellement boucler dessus :

     

    foreach (DataRow rowWhere in list)
    {
     Console.WriteLine( rowWhere["ArticleProduction"].ToString() );
    }

     

    En espérant avoir répondu à vos questions.

    Cordialement

     

    mercredi 5 mai 2010 08:48
    Modérateur
  • Bon, le LINQ est assez nouveau pour moi mais j'en suis arrivé à un résultat qui marche
          var aaa = (from DataRow dr in ds.Tables["Article"].Rows
                where (string)dr["Code"] == "001374I"
                select dr).ToList();
    
          bool resultat;
    
          foreach (DataRow p in aaa)
          {
            resultat = (p.Field<bool>("ArticleProduction"));
    
          }
    C'est peut être possible ou pas de réduire le code mais en tout cas, je peux faire des tests dessus simplement maintenant...
    • Marqué comme réponse lansing-2009 jeudi 6 mai 2010 09:19
    mercredi 5 mai 2010 09:31
  • bool Resultat = ds.Tables["Article"].Rows.Count(dr=>   (string)dr["Code"] == "001374I" && (bool)dr["ArticleProduction"]) > 0 ;

    voilà du code optimisé.

    Cordialement

    mercredi 5 mai 2010 12:44
  • Essaie cela.

    bool  Resultat = ds.Tables["Article"].Rows.Count(dr=> (string)dr["Code"] == "001374I" && (bool)dr["ArticleProduction"]) > 0 ;

    Cordialement


    mercredi 5 mai 2010 12:50