Précédent   Forum des professionnels en informatique > Dotnet > Accès aux données > Linq
Linq Forum d'entraide sur la manipulation de données avec Linq
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/10/2011, 16h32   #1
Membre confirmé
 
Avatar de dacid
 
Homme
Inscription : juin 2003
Messages : 858
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2003
Messages : 858
Points : 260
Points : 260
Par défaut [C#] LINQ to SQL => orderby dynamique (en string)

Bonjour @ tous,

Voilà, la question est simple, mais j'ai l'impression que la réponse est compliquée.

Je remplit une gridView depuis les entités, et j'aimerais pourvoir mettre mon orderby de manière paramétrable... De cette manière, en algorithme:
Code :
1
2
3
4
5
6
7
8
9
10
11
        private void chargerListe(string ordreChamp, string ordreSens) {
            using (connStrEntities bdd = new connStrEntities()) {
                var req = from M in bdd.tblModules 
                          join S in bdd.tblSites on M.modSitId equals S.sitId
                          join T in bdd.tblTrains on M.modTrnId equals T.trnId
                          select new { M.modId, M.modLib, M.modNomFic, M.modDateMod, M.modEtat, M.modTag, M.modSitId, M.modTrnId, 
                              S.sitLib, T.trnLib, nbImg=(from L in bdd.tblModDoc where L.mdDocId == M.modId select L).Count() }; // */
                req.OrderBy(ordreChamp+ " " + ordreSens);
                gvMain.DataSource = req; // */
                gvMain.DataBind();
            }
Mais vous devinez bien que ça ne compile même pas... Le odrerBy prends des paramètres qui me dépassent.

Pouvez vous m'aider ?

Merci d'avance.
__________________
David.
dacid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 16h37   #2
Membre Expert
 
Homme Benoît
Inscription : février 2003
Messages : 1 200
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 31
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 200
Points : 1 781
Points : 1 781
Code :
myOrdreBy= "M.modLib ascending, M.modNomFic ascending"

Code :
1
2
3
4
5
6
7
8
9
10
11
private void chargerListe(string myOrdreBy) {
            using (connStrEntities bdd = new connStrEntities()) {
                var req = from M in bdd.tblModules 
                          join S in bdd.tblSites on M.modSitId equals S.sitId
                          join T in bdd.tblTrains on M.modTrnId equals T.trnId
                          orderby myOrdreBy
                          select new { M.modId, M.modLib, M.modNomFic, M.modDateMod, M.modEtat, M.modTag, M.modSitId, M.modTrnId, 
                              S.sitLib, T.trnLib, nbImg=(from L in bdd.tblModDoc where L.mdDocId == M.modId select L).Count() }; // */
                gvMain.DataSource = req; // */
                gvMain.DataBind();
            }
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 16h40   #3
Responsable .NET
 
Avatar de tomlev
 
Homme Thomas Levesque
Développeur .NET
Inscription : février 2004
Messages : 16 721
Détails du profil
Informations personnelles :
Nom : Homme Thomas Levesque
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2004
Messages : 16 721
Points : 26 694
Points : 26 694
http://weblogs.asp.net/scottgu/archi...y-library.aspx
__________________

Pas de questions techniques par MP ! Le forum est là pour ça...

Tutoriels : Les markup extensions en WPF - La sérialisation XML avec .NET (Aller plus loin) - Une visite guidée de WPF (traduction)
Projet : Dvp.NET, la librairie .NET open-source des membres de Developpez !

Envie de contribuer à la rubrique .NET ?
tomlev est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 16h54   #4
Membre confirmé
 
Avatar de dacid
 
Homme
Inscription : juin 2003
Messages : 858
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2003
Messages : 858
Points : 260
Points : 260
Fiouf, quelle rapidité...

Bonjour Benoit,

C'est ce que j'ai essayé en premier mais non, ça ne fonctionne pas...

Bonjour tomlev,

Houlala, c'est démesuré cette librairie... Il me faut inclure la totalité du Zip à mon projet ? Il y a quand même un bon millier de fichiers...
Je débute en Linq et je doit surement poser des questions à coté, mais ... Il n'y a pas moyen de faire un cast de ma chaine pour que ça colle au paramètres attendus par le orderby() ?
__________________
David.
dacid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 17h00   #5
Membre Expert
 
Homme Benoît
Inscription : février 2003
Messages : 1 200
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 31
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 200
Points : 1 781
Points : 1 781
Citation:
Envoyé par dacid Voir le message
Fiouf, quelle rapidité...

Bonjour Benoit,

C'est ce que j'ai essayé en premier mais non, ça ne fonctionne pas...
Pourtant je l'ai dans mon code mais avec une simple List<> mais je vois pas ce que ca change

Ce passe quoi quand tu mets le orderby ?
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 17h07   #6
Membre confirmé
 
Avatar de dacid
 
Homme
Inscription : juin 2003
Messages : 858
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2003
Messages : 858
Points : 260
Points : 260
TomLev,

Bon, j'ai réussi à la mettre en place (j'ai prit le mauvais lien), mais du coup, ce n'est plus du tout du linq...
Il n'y a pas moyen de faire l'un dans l'autre ?
Ou alors, comment reproduire ma requête avec les jointures et le Count ?

Benoit, je suis en Framework 4, c'est p-e pour ça que ça ne fonctionne pas... En fait, il ne se passe rien, il execute la requête mais n'effectue pas le orderBy. Mais je vais retenter malgré tout.
Peux tu me faire voir ton exemple, STP, des fois ça ne joue à rien.
Le list par exemple...

David.
__________________
David.
dacid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 17h14   #7
Membre Expert
 
Homme Benoît
Inscription : février 2003
Messages : 1 200
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 31
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 200
Points : 1 781
Points : 1 781
Code :
1
2
3
var sortedlist = from donneeAffilie in listDonneeAffilie
                                 orderby string.Join(",", listOrderBy.ToArray())
                                 select donneeAffilie;
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 17h19   #8
Membre Expert
 
Homme Benoît
Inscription : février 2003
Messages : 1 200
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 31
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 200
Points : 1 781
Points : 1 781
Il y a une difference entre du linq et du linq to sql?
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 17h36   #9
Membre confirmé
 
Avatar de dacid
 
Homme
Inscription : juin 2003
Messages : 858
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2003
Messages : 858
Points : 260
Points : 260
Je ne suis pas le mieux placé pour répondre, mais il y a 3 Linq (qui est un terme générrique).
Linq to XML.
Linq to Objects
Linq to SQL.

Je penses que tu est dans la 2ème catégorie et moi la 3ème...

David.
__________________
David.
dacid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 17h38   #10
Membre Expert
 
Avatar de GuruuMeditation
 
Homme Olivier Matis
Software Architect
Inscription : octobre 2010
Messages : 767
Détails du profil
Informations personnelles :
Nom : Homme Olivier Matis
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Software Architect
Secteur : Conseil

Informations forums :
Inscription : octobre 2010
Messages : 767
Points : 1 577
Points : 1 577
Envoyer un message via MSN à GuruuMeditation
Citation:
Envoyé par BenoitM Voir le message
Il y a une difference entre du linq et du linq to sql?
Linq to SQL doit être traduit en SQL, ce qui impose quelques limitations (ne peut utiliser que des fonctions qui sont traduisibles en sql)
__________________
Microsoft MVP : Visual C#

MCPD - Windows Developer 4
MCPD - Web Developer 4
MCTS - Silverlight 4, Development

“If debugging is the process of removing bugs, then programming must be the process of putting them in.”
(Edsger W. Dijkstra)
GuruuMeditation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 17h50   #11
Membre confirmé
 
Avatar de dacid
 
Homme
Inscription : juin 2003
Messages : 858
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2003
Messages : 858
Points : 260
Points : 260
Je croyait qu'une particularité du C# était de pouvoir appeler des objets par leur "méta" nom, c'est à dire par une chaine qui correspond à leur nom.
De cette manière, un peu:
estUnObjet("maClasse").maMethode().

Je ne sais plus comment ça s'appelle, j'ai lu ç il y a quelque temps.

Est ce que ce ne serait pas applicable dans ce contexte ?
__________________
David.
dacid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 17h51   #12
Responsable .NET
 
Avatar de tomlev
 
Homme Thomas Levesque
Développeur .NET
Inscription : février 2004
Messages : 16 721
Détails du profil
Informations personnelles :
Nom : Homme Thomas Levesque
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2004
Messages : 16 721
Points : 26 694
Points : 26 694
Citation:
Envoyé par dacid Voir le message
Houlala, c'est démesuré cette librairie... Il me faut inclure la totalité du Zip à mon projet ? Il y a quand même un bon millier de fichiers...
Non, il faut juste le fichier DynamicQuery.cs qui est dans LinqSamples\DynamicQuery\DynamicQuery


Citation:
Envoyé par dacid Voir le message
Bon, j'ai réussi à la mettre en place (j'ai prit le mauvais lien), mais du coup, ce n'est plus du tout du linq...
Euh, c'est à dire ? Qu'est-ce que tu entends par là ?
Fais voir le code où tu l'utilises
__________________

Pas de questions techniques par MP ! Le forum est là pour ça...

Tutoriels : Les markup extensions en WPF - La sérialisation XML avec .NET (Aller plus loin) - Une visite guidée de WPF (traduction)
Projet : Dvp.NET, la librairie .NET open-source des membres de Developpez !

Envie de contribuer à la rubrique .NET ?
tomlev est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 17h56   #13
Membre confirmé
 
Avatar de dacid
 
Homme
Inscription : juin 2003
Messages : 858
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2003
Messages : 858
Points : 260
Points : 260
TomLev,

En fait, j'ai vu que je pouvait faire cfonctionner la classe comme dans l'exemple... Seulement , je constate que ce n'est plus du tout du linq.
Et ma question était:
Comment, avec cette nouvelle syntaxe, je pouvais reproduire ma requète ci dessus (avec les join est le count).
__________________
David.
dacid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 18h18   #14
Responsable .NET
 
Avatar de tomlev
 
Homme Thomas Levesque
Développeur .NET
Inscription : février 2004
Messages : 16 721
Détails du profil
Informations personnelles :
Nom : Homme Thomas Levesque
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2004
Messages : 16 721
Points : 26 694
Points : 26 694
Citation:
Envoyé par dacid Voir le message
Seulement , je constate que ce n'est plus du tout du linq.
OK mais qu'est-ce que tu entends par "ce n'est plus du Linq" ? La méthode OrderBy fournie par Dynamic Linq s'applique à un IQueryable et renvoie un IQueryable, donc clairement ça reste du Linq...

Il faut juste que tu fasses :

Code :
req = req.OrderBy(ordreChamp+ " " + ordreSens);
(soit presque ce que tu avais écris au départ, sauf qu'il faut affecter le résultat de OrderBy à ta variable
__________________

Pas de questions techniques par MP ! Le forum est là pour ça...

Tutoriels : Les markup extensions en WPF - La sérialisation XML avec .NET (Aller plus loin) - Une visite guidée de WPF (traduction)
Projet : Dvp.NET, la librairie .NET open-source des membres de Developpez !

Envie de contribuer à la rubrique .NET ?
tomlev est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 19h35   #15
Membre Expert
 
Avatar de GuruuMeditation
 
Homme Olivier Matis
Software Architect
Inscription : octobre 2010
Messages : 767
Détails du profil
Informations personnelles :
Nom : Homme Olivier Matis
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Software Architect
Secteur : Conseil

Informations forums :
Inscription : octobre 2010
Messages : 767
Points : 1 577
Points : 1 577
Envoyer un message via MSN à GuruuMeditation
Citation:
Envoyé par dacid Voir le message
Je croyait qu'une particularité du C# était de pouvoir appeler des objets par leur "méta" nom, c'est à dire par une chaine qui correspond à leur nom.
De cette manière, un peu:
estUnObjet("maClasse").maMethode().
Tu parles de Reflection?
__________________
Microsoft MVP : Visual C#

MCPD - Windows Developer 4
MCPD - Web Developer 4
MCTS - Silverlight 4, Development

“If debugging is the process of removing bugs, then programming must be the process of putting them in.”
(Edsger W. Dijkstra)
GuruuMeditation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 09h28   #16
Membre confirmé
 
Avatar de dacid
 
Homme
Inscription : juin 2003
Messages : 858
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2003
Messages : 858
Points : 260
Points : 260
tomlev,

Dans ce cas, je ne doit pas avoir réussi à intégrer la librairie, car le orderBy n'a toujours que 3 overLoad dont aucun ne prend une string.
(j'ai juste glissé DynamicLibrary.cs dans App_Code... Ai-je oublié quelque chose ?)

Le seul orderBy qui prend une chaine que je vois est implémenté sur l'obje context (bdd dans mon cas).
Code :
1
2
3
4
5
6
7
8
9
10
11
12
        private void chargerListe(string ordreChamp, string ordreSens) { // http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
            using (connStrEntities bdd = new connStrEntities()) {
                var req = from M in bdd.tblModules 
                          join S in bdd.tblSites on M.modSitId equals S.sitId
                          join T in bdd.tblTrains on M.modTrnId equals T.trnId
                          select new { M.modId, M.modLib, M.modNomFic, M.modDateMod, M.modEtat, M.modTag, M.modSitId, M.modTrnId, 
                              S.sitLib, T.trnLib, nbImg=(from L in bdd.tblModDoc where L.mdDocId == M.modId select L).Count() }; // */
                req = req.OrderBy(ordreChamp + " " + ordreSens);
                gvMain.DataSource = req; // */
                gvMain.DataBind();
            }
        }
Dans ce code, toute la ligne OrderBy(); est soulignée en rouge et ne compile donc même pas.


GuruuMeditation,
Oui, en effet, c'est bien de réflexion dont je parlais, mais je doute que ça s'applique dans ce contexte...
__________________
David.
dacid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 09h31   #17
Membre Expert
 
Homme Benoît
Inscription : février 2003
Messages : 1 200
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 31
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 200
Points : 1 781
Points : 1 781
tu n'as pas oublié d'ajouter le using?
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 09h35   #18
Responsable .NET
 
Avatar de tomlev
 
Homme Thomas Levesque
Développeur .NET
Inscription : février 2004
Messages : 16 721
Détails du profil
Informations personnelles :
Nom : Homme Thomas Levesque
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2004
Messages : 16 721
Points : 26 694
Points : 26 694
Tu as mis un using System.Linq.Dynamic; dans ton code ?
__________________

Pas de questions techniques par MP ! Le forum est là pour ça...

Tutoriels : Les markup extensions en WPF - La sérialisation XML avec .NET (Aller plus loin) - Une visite guidée de WPF (traduction)
Projet : Dvp.NET, la librairie .NET open-source des membres de Developpez !

Envie de contribuer à la rubrique .NET ?
tomlev est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 09h40   #19
Membre confirmé
 
Avatar de dacid
 
Homme
Inscription : juin 2003
Messages : 858
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2003
Messages : 858
Points : 260
Points : 260
J'ai essayé en fait, mais il ne me le propose pas dans la liste.
Il le colorie en rouge si je le force.

C'est une appli Web que j'ai et j'ai créé le répertoire App_Code à la main à travers l'interface.
En fait, je viens de m’apercevoir que, comparé à un autre projet, l'icone du répertoire est gris mais ne possède pas le petit carré dessus. Comment faire pour que l'appli le valide ?
(en même temps, App_Data n'a pas le petit cylindre et la base dedans est bien détectée...)
__________________
David.
dacid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 09h53   #20
Responsable .NET
 
Avatar de tomlev
 
Homme Thomas Levesque
Développeur .NET
Inscription : février 2004
Messages : 16 721
Détails du profil
Informations personnelles :
Nom : Homme Thomas Levesque
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2004
Messages : 16 721
Points : 26 694
Points : 26 694
Citation:
Envoyé par dacid Voir le message
C'est une appli Web que j'ai et j'ai créé le répertoire App_Code à la main à travers l'interface.
En fait, je viens de m’apercevoir que, comparé à un autre projet, l'icone du répertoire est gris mais ne possède pas le petit carré dessus. Comment faire pour que l'appli le valide ?
(en même temps, App_Data n'a pas le petit cylindre et la base dedans est bien détectée...)
Euh, alors là j'en sais rien... pour moi le développement web s'apparente à la magie noire

Vérifie dans les propriétés du fichier si la Build Action (action de génération) est bien "Compile"
__________________

Pas de questions techniques par MP ! Le forum est là pour ça...

Tutoriels : Les markup extensions en WPF - La sérialisation XML avec .NET (Aller plus loin) - Une visite guidée de WPF (traduction)
Projet : Dvp.NET, la librairie .NET open-source des membres de Developpez !

Envie de contribuer à la rubrique .NET ?
tomlev est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h35.


 
 
 
 
Partenaires

Hébergement Web