Чистый способ LINQ - группировать по имени, выбирать отдельные группы по ключу, а затем выбирать на основе этого.
from i in user
group new {i.ID, i.Country, i.DateRecord} by i.Name into byNmGp
select byNmGp.First();
Редактировать: Entity Framework, конечно, очень популярный поставщик linq, ноздесь он не обрабатывает First()
, хотя логически эквивалентный (в данном случае) FirstOrDefault()
будет работать нормально.Я предпочитаю First()
, когда его не принудительно вводят в FirstOrDefault()
из-за ограничений EF, потому что его значение лучше соответствует искомому здесь.
Другой способ - определить вспомогательный класс:
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();
Это просто определяет отличное по-другому.Производительность будет зависеть от того, сможет ли поставщик запросов интерпретировать это определение равенства или нет.Удобство будет зависеть от того, выполняете ли вы похожие запросы LINQ практически одинаково или нет.