Ответ 1
Следующее выражение выберет только отдельные компании и вернет первое вхождение с его идентификатором.
partnerService.SelectPartners().GroupBy(p => p.Name).Select(g => g.First());
Я пытаюсь заполнить раскрывающийся список фармацевтическими компаниями, такими как Bayer, Medley и т.д. И я получаю имена тезисов от DB, а имена тегов повторяются в DB, но с разными идентификаторами.
Я пытаюсь использовать Linq Distinct(), но я не хочу использовать сопоставитель равенства. Есть ли другой способ?
Мой раскрывающийся список должен быть заполнен идентификатором и именем компании.
Я пытаюсь что-то вроде:
var x = _partnerService
.SelectPartners()
.Select(c => new {codPartner = c.codPartner, name = c.name})
.Distinct();
Это показывает повторяющиеся компании в ddl.
спасибо!
Следующее выражение выберет только отдельные компании и вернет первое вхождение с его идентификатором.
partnerService.SelectPartners().GroupBy(p => p.Name).Select(g => g.First());
var distinctCompanies = Companies
.GroupBy(c => c.CompanyName)
.Select(g => g.First());
Отличительная особенность работает во всем выборе. Если вы включите c.codPartner в select, и есть два разных значения c.codPartner для того же c.name, то вы увидите две строки с тем же именем c.name.
Я не думаю, что вы можете сделать это с помощью анонимного класса, но если вы создали объект данных, например
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; }
}
}
вы можете создать объект-компаратор, например
class FooComparer : IEqualityComparer<Foo>
{
public bool Equals(Foo x, Foo y)
{
return x.Name == y.Name;
}
public int GetHashCode(Foo obj)
{
return obj.GetHashCode();
}
}
Если вы не укажете параметр IEqualityComparer, тогда он просто будет использовать Object.ReferenceEquals, который будет рассматривать значение объектов GetHashKey. Для анонимных типов они уникальны.
Теперь решение этого немного сложно, поскольку вы не можете написать IEqualityComparer для анонимного типа. Поэтому вы можете создать реальный тип проблемы:
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();
Distinc будет использовать GetHashCode, если вы не скажете (через IEqualityComparer) использовать другой метод. Вы можете использовать общий принцип равенства, например:
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
}
а затем используйте это (kindof)
public static IEqualityComparer<YourType> MyComparer
{
get
{
return new GenericEqualityComparer<YourType>((x, y) =>
{
return x.name.Equals(y.name);
});
}
}
просто передайте свой собственный сравнитель с методом Distinct, используя одну из других перегрузок.
(extension) IQueryable<T> IQueryable<T>.Distinct( IEqualityComparer<T> comparer )