web-dev-qa-db-fra.com

Linq Distinct () par nom pour remplir une liste déroulante avec nom et valeur

J'essaie de remplir une liste déroulante avec des sociétés pharmaceutiques, comme Bayer, Medley etc. Et, je reçois ces noms de DB et ces noms sont répétés dans DB, mais avec des identifiants différents.

J'essaie d'utiliser Linq Distinct (), mais je ne veux pas utiliser le comparateur d'égalité. Y a-t-il un autre moyen?

Ma liste déroulante doit être remplie avec l'identifiant et le nom de l'entreprise.

J'essaie quelque chose comme:

var x = _partnerService
           .SelectPartners()
           .Select(c => new {codPartner = c.codPartner, name = c.name})
           .Distinct();

Cela montre les entreprises répétées en ddl.

merci!

33
AndreMiranda

L'expression suivante sélectionnera uniquement des sociétés distinctes et renverra la première occurrence avec son identifiant.

partnerService.SelectPartners().GroupBy(p => p.Name).Select(g => g.First());
76
Daniel Brückner
var distinctCompanies = Companies
  .GroupBy(c => c.CompanyName)
  .Select(g => g.First());
17
Amy B

Des œuvres distinctes sur l'ensemble de la sélection. Si vous incluez c.codPartner dans la sélection et qu'il existe deux valeurs différentes de c.codPartner pour le même c.name, vous allez voir deux lignes avec le même c.name.

3
Robert Harvey

Je ne pense pas que vous puissiez le faire avec une classe anonyme, mais si vous avez créé un objet de données comme

    class Foo
{
    private int _ID;

    public int ID
    {
        get { return _ID; }
        set { _ID = value; }
    }
    private string _Name;

    public string Name
    {
        get { return _Name; }
        set { _Name = value; }
    }

}

vous pouvez créer un objet comparateur comme

    class FooComparer : IEqualityComparer<Foo>
{


    public bool Equals(Foo x, Foo y)
    {
        return x.Name == y.Name;
    }

    public int GetHashCode(Foo obj)
    {
        return obj.GetHashCode();
    }

}
2
wegrata

Si vous ne spécifiez pas de paramètre IEqualityComparer, il utilisera simplement Object.ReferenceEquals, qui examine la valeur GetHashKey des objets. Pour les types anonymes, ils sont uniques.

Maintenant, résoudre ce problème est un peu délicat, car vous ne pouvez pas écrire un IEqualityComparer pour un type anonyme. Vous devez donc créer un type réel pour le problème:

class Partner
{
    public int codPartner {get; set;}
    public string name {get; set;}
    public override int GetHashCode() { return name .GetHashCode();}
}

var x = _partnerService.SelectPartners()
        .Select(c => new Partner {codPartner = c.codPartner, name = c.name})
        .Distinct();
1
James Curran

Distinc utilisera GetHashCode si vous ne lui dites pas (via un IEqualityComparer) d'utiliser une autre méthode. Vous pouvez utiliser un comparateur d'égalité générique, comme ceci:

public class GenericEqualityComparer<T> : IEqualityComparer<T>
{    
    private Func<T, T, Boolean> comparer;    

    public GenericEqualityComparer(Func<T, T, Boolean> comparer)    
    {        
        this.comparer = comparer;    
    }    

    #region IEqualityComparer<T> Implementation

    public bool Equals(T x, T y)    
    {        
        return comparer(x, y);    
    }    

    public int GetHashCode(T obj)    
    {
        return obj.GetHashCode();  
    }    

    #endregion
}

puis utiliser comme ça (kindof)

public static IEqualityComparer<YourType> MyComparer
{
   get
     {
      return new GenericEqualityComparer<YourType>((x, y) =>
       {
          return x.name.Equals(y.name);
        });
      }
}
1
Johan Leino

passez simplement votre propre comparateur à la méthode Distinct en utilisant l'une des autres surcharges.

(extension) IQueryable<T> IQueryable<T>.Distinct( IEqualityComparer<T> comparer )
0
Scott Ivey