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 :

union linq to sql


Sujet :

Linq

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut union linq to sql
    Bonjour,
    J'ai un objet ThirdParty :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class ThirdParty
        {
            [Required(ErrorMessage = "OID is required.")]
            public int OID { get; set; }
     
            [Required(ErrorMessage = "Name is required.")]
            [StringLength(255, ErrorMessage = "Name must be under 255 characters.")]
            public string Name { get; set; }
        }
    et la méthode suivante :
    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 IList<ThirdParty> GetThirdPartys(int OID)
            {
                IList<ThirdParty> tps = null;
                if (OID != 9999)
                {
                    tps = (from tp in DB.ThirdParties
                           where tp.OID == OID
                           orderby tp.Name
                           select new ThirdParty
                           {
                               OID = tp.OID,
                               Name = tp.Name
                           }).ToList();
                }
                else
                {
                    tps = (from tp in DB.ThirdParties
                           orderby tp.Name
                           select new ThirdParty
                           {
                               OID = tp.OID,
                               Name = tp.Name,
                           }).ToList();
                }
                return tps;
            }
    J'ai besoin en fait de retourner en dur un ThirdParty en plus qui aurait un OID à -1 et un Name à "toto" quand on appelle GetThirdPartys(9999).
    Je voulais faire du genre comme ça, mais ça ne fonctionne pas, problème de syntaxe ? :
    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
    27
    28
    29
    30
    public static IList<ThirdParty> GetThirdPartys(int OID)
            {
                IList<ThirdParty> tps = null;
                if (OID != 9999)
                {
                    tps = (from tp in DB.ThirdParties
                           where tp.OID == OID
                           orderby tp.Name
                           select new ThirdParty
                           {
                               OID = tp.OID,
                               Name = tp.Name
                           }).ToList();
                }
                else
                {
                    tps = (from tp in DB.ThirdParties
                           orderby tp.Name
                           select new ThirdParty
                           {
                               OID = tp.OID,
                               Name = tp.Name,
                           }).Union(select new ThirdParty
                           {
                               OID = -1,
                               Name = "toto",
                           }).ToList();
                }
                return tps;
            }

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    L'opérateur Union attend un type équivalent au résultat de la requête le précédent. Dans ton cas, tu obtiens d'abord un objet de type IList<ThirdParty>, comme le prouve ce code :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (from tp in DB.ThirdParties
     orderby tp.Name
     select new ThirdParty
     {
         OID = tp.OID,
         Name = tp.Name,
     })
    Donc ton Union s'attend à recevoir un objet du type IList<ThirdParty>, ou plus précisément IEnumerable<ThirdParty>. La solution consiste donc à créer à l'avance l'objet que tu souhaites passer dans l'opérateur Union. Exemple :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var itemToAdd = new List<ThirdParty>();
    itemToAdd.Add(new ThirdParty { OID = -1, Name = "toto" });
     
    tps = (from tp in tps
               orderby tp.Name
               select new ThirdParty
               {
                    OID = tp.OID,
                    Name = tp.Name,
               }).Union(itemToAdd).ToList();
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Ok merci, ça marche bien dans ce cas là effectivement. En fait je pensais qu'avec cette réponse je pourrais résoudre un problème quasi-similaire mais j'a iun autre souci. En effet, comment gérer la même chose mais avec un type anonyme ? Je m'explique, j'ai une table ThirdParties :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <Table Name="dbo.ThirdParty" Member="ThirdParties">
        <Type Name="ThirdParty">
          <Column Name="OID" Type="System.Int32" DbType="Int NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
          <Column Name="Name" Type="System.String" DbType="NVarChar(255) NOT NULL" CanBeNull="false" />
        </Type>
      </Table>
    Et une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static IEnumerable GetThirdPartysCompletion(int OID)
            {
                return from tp in DB.ThirdParties
                       where tp.OID == OID
                       orderby tp.Name
                               select new
                       { tp.OID, tp.Name };
            }
    C'est en fait ici que je veux rajouter un élément en dure qui n'existe pas en base, qui est OID=-1 et Name="toto". J'ai essayé comme dans l'exemple précédent, mais comme il s'agit ici de type anonyme (new {OID, Name}), je ne vois pas comment réaliser cela, à part à créer un objet qui contiendrait OID et Name. Est-ce qu'il y a un moyen?
    D'avance merci,
    Julien

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Oui c'est possible, mais il te faut pour cela deux méthodes anonymes avec les mêmes propriétés. Comme tout à l'heure, on crée l'élément à rajouter :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var itemToAdd = new List<ThirdParty>();
    itemToAdd.Add(new ThirdParty { OID = -1, Name = "toto" });
    L'idée est donc de récupérer d'abord le premier type anonyme :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var q = (from tp in tps
             orderby tp.Name
             select new
             {
                 OID = tp.OID,
                 Name = tp.Name,
             }).ToList();
    Ensuite on va requêter notre objet itemToAdd afin de pouvoir créer le second type anonyme :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var t = q.Union(from item in itemToAdd
                    select new
                    {
                        OID = item.OID,
                        Name = item.Name
                    });
    Dans la variable t, on a bien l'union des deux requêtes On peut tout concaténer en une seule requête comme tu l'avais fait, mais j'ai découpé pour que ça soit un peu plus clair.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    merciiii!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/02/2008, 14h14
  2. [Linq 2 SQL] Problème de modélisation
    Par tomlev dans le forum Accès aux données
    Réponses: 5
    Dernier message: 12/02/2008, 23h29
  3. [Linq to sql] db.add() ?
    Par telynette dans le forum Accès aux données
    Réponses: 2
    Dernier message: 08/02/2008, 19h54
  4. [Linq to SQL] Refresh du dbml
    Par zeavan dans le forum Visual Studio
    Réponses: 5
    Dernier message: 02/01/2008, 10h15
  5. Union de requetes sql
    Par bejaad dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 26/05/2005, 17h42

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