LINQ TO - type retour données [Résolu]

Kikuts 162 Messages postés jeudi 11 janvier 2007Date d'inscription 5 novembre 2010 Dernière intervention - 4 août 2009 à 13:34 - Dernière réponse : Kikuts 162 Messages postés jeudi 11 janvier 2007Date d'inscription 5 novembre 2010 Dernière intervention
- 6 août 2009 à 09:16
Bonjour à vous amis développeurs !

Je suis en train de créer un service web. Dans ce service, j'y code des requêtes LINQ.

Avant de poser ma question, je vais planter le décor :

Soit ma table Personne avec les champs id, nom, prenom, age, sexe, ville, tel.

Si j'ai une requête qui prend toutes les personnes je fais un truc comme ça :
List WCF_IServices.GetPersonnes()
{
     DBDataContext dbc = new DBDataContext();
     var sql = from p in dbc.PERSONNE select p;
     return sql.ToList();
}

Si je souhaite avoir la liste des personnes, nom et prénom uniquement, je vais faire :

List< ******* > WCF_IServices.GetPersonnes()
{
     DBDataContext dbc = new DBDataContext();
     var sql = from p in dbc.PERSONNE
     select new { p.NOM , p.PRENOM , p.TEL };
     return sql.ToList();
}


Mais dans ce cas de figure, quel est le type des données récupéré ? Ce ne sont pas des personnes. Je sais qu si j'avais fait un select sur juste le nom, un List<string> aurait fait l'affaire.

Merci d'avance ; )
Bonne journée.
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 4 août 2009 à 19:38
3
Merci
Salut,

Les types retournés par les requetes Linq sont des types anonymes.
Il faut donc utilisé un type de données qui est propre a ton interrogation
et qui soit le plus generique possible de facon a avoir un wsdl generique pour les différentes interrogations par un web service.

N'hesite pas a utiliser des complexes types dans le type de tes données WSDL.

Exemple

PersonneResponse
--CodeResponse (pour indiqué qu'il y a une erreur
--NombreDePerssonnes
--ListePersonne
----Personne(nom, prenom, id, .....)



Bon courage.

Merci nhervagault 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de nhervagault
Meilleure réponse
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 5 août 2009 à 13:45
3
Merci
La classe Personne devrait être crée en fonction de ce qu'il y a dans la database.
Exemple:

DB: Nom, Prenom, Adresse => class personne avec les 3 properties

Ensuite, tu requetes dessus

var x = from p in tralala.Personne
select new Person{Nom=p.Nom}

Les autres champs pas utilisé (Prenom, Adresse) auront alors la valeur par défaut (probablement, null)




[hr]
-Blog-
-Site Perso-

Merci cs_Bidou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_Bidou
Kikuts 162 Messages postés jeudi 11 janvier 2007Date d'inscription 5 novembre 2010 Dernière intervention - 4 août 2009 à 17:38
0
Merci
Pour contourner le problème, pour l'instant je créer une classe pour chaque sélection dans une table ... C'est loin d'être propre ! Donc si qq1 a une solution à ma question :) ca serait très généreux de sa part !

Une nouvelle question sur linq :

admettons la requete :
var rez =
from t in table
select new {t.col1, col2, col3, cols 4 ...)

Quand j'affiche le résultat dans une grille avec Silverlight, les données sortent dans un sens différent : colone 1 devient col2 au lieu de col1, puis col4 vient à la place de col2, col 1 vient en col3 et col 4 reste en col4.

Où et comment puis je modifier l'ordre d'apparition des entêtes ? merci

Mais à l'affichage (auto generate collumns
Commenter la réponse de Kikuts
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 5 août 2009 à 08:49
0
Merci
Bonjour,
Ceci ne ferait-il pas l'affaire ?

     DBDataContext dbc = new DBDataContext();
     var sql = from p in dbc.PERSONNE
     select new Person { NOM p.NOM , PRENOM p.PRENOM , TEL = p.TEL };
     return sql.ToList();



[hr]
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
Kikuts 162 Messages postés jeudi 11 janvier 2007Date d'inscription 5 novembre 2010 Dernière intervention - 5 août 2009 à 09:34
0
Merci
Salut Bidou ! Merci tu me rassures :) c'est la solution que j'ai trouvé en attendant de trouver mieux ^^

Mais le problème c'est qu'a chaque fois que je sélectionne des champs supplémentaire dans mon select, je dois créer une classe.

En l'occurrence, la table Person. Mais si dans une autre liste ressemblante, j'ai la liste des personne et leurs travaux effectué (peu importe le sujet disons juste que l'on a des champs de retour différents : on n'a pas un List en retour)

Par exemple :

Public class Person
{
public string NOM {get;set;}
public string PRENOM {get;set;}
public string TEL {get;set;}
}

var sql = from p in dbc.PERSONNE

Mais si je décide d'afficher son travail (le libellé de son poste par exemple)

var sql = from p in dbc.PERSONNE
join po in poste .........
select new Person { NOM p.NOM , PRENOM p.PRENOM , TEL = p.TEL, POSTE =po.LIBELLE };

Devrais je recréer une autre classe exprès ?

------------------

Avez vous une idée pour l'ordre d'affichage des colonnes dans un datagrid ?

------------------

Merci de vos réponses rapides et précises. C'est toujours sympa :) Bonne journée à vous 2 ! (Et à ceux qui se joindront à ce post :p)
Commenter la réponse de Kikuts
Kikuts 162 Messages postés jeudi 11 janvier 2007Date d'inscription 5 novembre 2010 Dernière intervention - 5 août 2009 à 14:21
0
Merci
Ok merci j'ai compris !

Enfin je crois ^^

Donc si dans ma DB j'ai Nom, Prenom, Adresse,

Que j'ai la classe Personne

Pour avoir un champs supplémentaires Libellé travail par ex, je devrai faire

class salarie
{
private Personne p;
private string libelle;
}

C'est bien ça ? Merci ! :)
Commenter la réponse de Kikuts
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 5 août 2009 à 17:25
0
Merci
Non.
En principe, le contenu de la base de donnée ne devrait pas changer.
Si on part du principe que tu as dans la base de donnée Personne(Nom, Prenom, Adresse), alors tu fais une classe correspondante qui possède tes champs. Tu en auras jamais à rajouter...

Maintenant, si tu dois faire ta requête linq, et que tu n'as besoin que du nom, tu peux faire:

var x = from p in tralala.Personne
select new Person{Nom=p.Nom}

Si tu veux rajouter un champs, qui ne se trouve pas dans la base de donnée mais uniquement au niveau de classe, il suffit de rajouter une nouvelle propriété à la classe Personne.

Pas sûr de voir ou est le probleme !?


[hr]
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
Kikuts 162 Messages postés jeudi 11 janvier 2007Date d'inscription 5 novembre 2010 Dernière intervention - 6 août 2009 à 09:16
0
Merci
Ok ca y est j'ai compris ^^ dsl j'aime pas trop être dans le flou quitte à t'embêter une fois de plus :)

Encore merci ! Bonne journée ! Dès demain fera un temps de crotte donc profité (ba oui même derrière son ordi c'est plus agréable de travailler sous le soleil que la pluie lol) (je sais c'est hors topic ^^ mais il est clos donc ... :p)
Commenter la réponse de Kikuts

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.