El LINQ manera puramente que ocurre es agrupar por nombre, seleccione grupos distintos con llave, a continuación, seleccione basa en eso.
from i in user
group new {i.ID, i.Country, i.DateRecord} by i.Name into byNmGp
select byNmGp.First();
Editar: Entity Framework es, por supuesto, un proveedor de LINQ muy popular, pero no maneja First()
bien aquí, aunque el lógicamente equivalente (en este caso) FirstOrDefault()
va a funcionar bien. Prefiero First()
cuando no estoy forzado a FirstOrDefault()
por las limitaciones de EF, porque su significado se ajusta mejor a lo que se busca aquí.
Otra forma es definir una clase de ayuda:
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();
Esto simplemente define distinta manera diferente. El rendimiento diferirá según si el proveedor de la consulta puede interpretar esa definición de igualdad o no. La comodidad variará según si tiene consultas LINQ similares que hacen más o menos lo mismo.
Ha implicado que hay varios registros para cada 'Nombre'. Si eso es cierto, entonces la pregunta también debe indicar cómo elegir los otros campos (id, país, datecreated). Por ejemplo, para cada Nombre, ¿desea el registro con la fecha mínima creada? – crokusek