La manière purement LINQ qui se produit est de groupe par nom, sélectionner des groupes distincts par clé, puis sélectionnez sur cette base.
from i in user
group new {i.ID, i.Country, i.DateRecord} by i.Name into byNmGp
select byNmGp.First();
Edit: Entity Framework est bien sûr un fournisseur LINQ très populaire, mais il ne gère pas First()
bien ici, bien que la logique équivalente (dans ce cas) FirstOrDefault()
fonctionnera bien. Je préfère First()
lorsqu'il n'est pas forcé dans FirstOrDefault()
par les limitations d'EF, parce que sa signification correspond mieux à ce qui est recherché ici.
Une autre façon est de définir une classe d'aide:
private class MyRecord : IEquatable<MyRecord>
{
public int ID;
public string Name;
public string Country;
public DateTime DateCreated;
public bool Equals(MyRecord other)
{
return Name.Equals(other.Name);
}
public override bool Equals(object obj)
{
return obj is MyRecord && Equals((MyRecord)obj);
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
}
/*...*/
var items = (from i in user select new MyRecord {i.ID, i.Name, i.Country, i.DateRecord}).Distinct();
Cela définit simplement différemment distincts. Les performances diffèrent selon que le fournisseur de requêtes peut interpréter ou non cette définition de l'égalité. La commodité varie selon que vous avez des requêtes LINQ similaires qui font la même chose ou pas.
Vous avez impliqué qu'il y a plusieurs enregistrements pour chaque 'Nom'. Si cela est vrai, la question devrait également indiquer comment choisir les autres champs (id, country, datecreated). Par exemple, pour chaque nom, voulez-vous l'enregistrement avec le datecreated minimum? – crokusek