1

Ive получил следующий запрос, который привязывается к DropDownList;Запрос LINQ возвращает дубликат, несмотря на Distinct()

if (!Page.IsPostBack) 
     { 
      var branchTags = 
       (
        from t in context.ContactSet 
        orderby t.py3_BranchArea 
        where t.py3_BranchArea != null 
        select new 
        { 
         BranchTagCode = t.py3_BranchArea, 
         BranchTag = (t.FormattedValues != null && t.FormattedValues.Contains("py3_brancharea") ? t.FormattedValues["py3_brancharea"] : null) 
        } 
       ).Distinct(); 
      ddlBranchTags.DataSource = branchTags; 
      ddlBranchTags.DataBind(); 
     } 

По какой-то причине он по-прежнему использует 2 строки, которые визуально одинаковы. Возможно, в CRM есть два enitites с тем же именем. Но, если Im, использующий различный запрос и возвращающий только «py3_brancharea», то, несомненно, Distinct должен быть запущен на фактических возвращенных документах?

Таким образом, это говорит о том, чтобы мне й моем ограниченном LINQ, что его знаний из линии:

BranchTagCode = t.py3_BranchArea 

Но, это должно быть названо, чтобы можно назвать FormattedValues.

Как же получить явный набор результатов, основанный исключительно на «BranchTag»?

ответ

2

Если Distinct() не работает, возможно, это проблема с конкретными классами gethashcode() или equals() методами переопределения, которые либо не настроены правильно, либо полностью опущены. В пользовательском классе вам, скорее всего, нужно будет указать эти переопределения, чтобы получить Distinct() и другие подобные методы для правильной работы.

Вы можете попытаться использовать предложение where или any, чтобы различать дубликаты. Что может быть проблемой для Distinct() вопросов.

Подробнее о том, как настроить метод Distinct() с пользовательскими классами. Вам нужно будет в пределах класса, который вы ищете, с помощью методов переопределения GetHashCode() и Equals(). Эти или методы уровня объекта, которые должны быть в каждом классе независимо от того, что. Для того, чтобы начать голова к рассматриваемому классу и введите следующее:

public override bool Equals(object obj) затем public override int GetHashCode()

Допустит, у вас есть этот простой класс перед переопределениями:

class foo{ 
    int H {get;set;} 
    public foo(int _h){ 
     H = _h; 
    } 
} 

Это теперь будет выглядеть следующим образом:

class foo{ 
    int H {get;set;} 
    int K {get;set;} 

    public override bool Equals(object obj){ 
     if(obj == null) return false; 
     foo test = (foo)obj) 
     if(test == null) return false; 

     if(this.H == obj.H && this.K == obj.K) return true; 
    } 
    public override int GetHashCode(){ 
     int hashH = H.GetHashCode(); 
     int hashK = K.GetHashCode(); 

     return hashH^hashK; 
    } 

    public foo(int _h){ 
     H = _h; 
    } 
} 

Теперь вы можете использовать Distinct() на Ienumerable type s, содержащий foo класс как так:

List<foo> FooList = new List<foo>(Collection of 9 Foos); 
var res = FooList.Distinct(); 
+0

Любой шанс на пример. Я новичок в LINQ и сейчас борюсь с этой проблемой. Благодарю. –

+0

@PhillHealey проверить мои правки. – Nomad101

0

Возможно ли, что оба результата различны, они имеют ту же ветвь кода тег и тег ветви?

Вы можете реализовать пользовательский сопоставитель равенства и передать его в distinct(), чтобы он сравнивал только поле, которое вы хотите? это немного сложнее из-за анонимного типа в вашем заявлении select, но ответ this имеет отношение к этому.

+0

Да, я верю, что это так. Вот почему я опубликовал. Надеюсь найти способ сделать отчетливым только на втором поле. Ссылка выглядит так, как будто у нее есть потенциал. Благодарю. –

+0

На самом деле, эта ссылка не работает, к сожалению. Кроме того, при проверке CRM поля arent дублируются. Так что не знаю, как я могу выбрать отличный результат. –

+0

Можете ли вы предоставить больше кода, чтобы дать нам пример, демонстрирующий проблему? Каковы результаты, которые вызывают проблему? Можете ли вы воспроизвести его, если вы замените контекст сущности простым списком, который содержит два объекта, которые являются проблемой? – Matt

0

Сравнение равенства по умолчанию для анонимных типов чувствительно к регистру. Имеются ли ожидаемые значения для разных корпусов? Поскольку Мэтт предположил, что в противном случае вы захотите взглянуть на пользовательскую реализацию IEqualityComparer в пользовательском классе.

+0

Тот же корпус, поэтому не знаю, почему это вызовет проблему. –

1

Другой, гораздо более простой способ, который работал для меня, но не может работать во всех ситуациях, использует этот метод, ребята (GroupBy() и First()):

Finding Distinct Elements in a List

Он создает List<Customer> customers с FirstName и LastName. Затем группирует их по FirstName и захватывает первый элемент из каждой группы!

` 
List<Customer> customers = new List<Customer>; 
{ 
    new Customer {FirstName = "John", LastName = "Doe"}, 
    new Customer {FirstName = "Jane", LastName = "Doe"}, 
    new Customer {FirstName = "John", LastName = "Doe"}, 
    new Customer {FirstName = "Jay", LastName = null}, 
    new Customer {FirstName = "Jay", LastName = "Doe"} 
}; 
` 

Тогда:

` 
var distinctCustomers = customers.GroupBy(s => s.FirstName) 
           .Select(s => s.First()); 
` 

В моей ситуации, я должен был использовать FirstOrDefault() хотя.

Смежные вопросы