2009-10-12 8 views
5

Voici mon code:Comment utiliser un Distinct sur une colonne en utilisant Linq

var query = from row1 in table.AsEnumerable() 
         let time = row1.Field<DateTime>("time") 
         let uri = row1.Field<string>("cs-uri-stem") 
         let ip = row1.Field<string>("c-ip") 
         let questionid = row1.Field<int>("questionid") 
         where questionid == int.Parse(table.Rows[x]["questionid"].ToString()) 
         select new 
         { 
          time, 
          uri, 
          ip, 
          questionid 
         }; 

La colonne ip doit être unique. Je ne peux pas avoir d'éléments en double dans le champ ip. est-il possible de le faire dans linq

Répondre

7

Vous pouvez obtenir ce que vous voulez en groupant par l'adresse IP, mais vous aurez besoin de savoir comment vous voulez gérer l'autre champs lorsque vous avez des doublons.

var query = from row1 in table.AsEnumerable() 
        let time = row1.Field<DateTime>("time") 
        let uri = row1.Field<string>("cs-uri-stem") 
        let ip = row1.Field<string>("c-ip") 
        let questionid = row1.Field<int>("questionid") 
        where questionid == int.Parse(table.Rows[x]["questionid"].ToString()) 
        group by ip into g 
        select new 
        { 
         time = g.time.First(), 
         uri = g.uri.First(), 
         ip = g.Key, 
         questionid = g.questionid.First() 
        }; 
+0

cela a bien fonctionné. Merci – Luke101

2

Vous ne pouvez effectuer un Distinct sur tous les champs que vous sélectionnez, pas seulement sur un champ (quelles valeurs prendriez-vous pour les autres champs?).

Vous pouvez y parvenir en utilisant la méthode d'extension Distinct:

 var query = (from row1 in table.AsEnumerable() 
        let time = row1.Field<DateTime>("time") 
        let uri = row1.Field<string>("cs-uri-stem") 
        let ip = row1.Field<string>("c-ip") 
        let questionid = row1.Field<int>("questionid") 
        where questionid == int.Parse(table.Rows[x]["questionid"].ToString()) 
        select new 
        { 
         time, 
         uri, 
         ip, 
         questionid 
        }).Distinct(); 
2

Vous pouvez également utiliser Distinct() avec un comparateur d'égalité (à savoir, passer dans une méthode qui permettra de comparer la valeur IP et ignorer le reste). Mais comme le demande tvanfosson, quelle est la procédure correcte pour gérer les valeurs en double?

Questions connexes