2015-02-26 5 views
4

Я пытаюсь использовать AsEnumerable, чтобы вытащить объект Entity Framework DbContext в IEnumerable<SelectListItem>. Это будет использоваться как свойство модели, которое заполняет выпадающее меню..Distinct() call not filtering

Однако каждый запрос сохраняет повторяющиеся записи, несмотря на то, что вызывал Distinct().

public IEnumerable<SelectListItem> StateCodeList { get; set; } 
public IEnumerable<SelectListItem> DivCodeList { get; set; }  

DivCodeList = 
    db.MarketingLookup.AsEnumerable().OrderBy(x => x.Division).Distinct().Select(x => new SelectListItem 
        { 
         Text = x.Division, 
         Value = x.Division 
        }).ToList(); 

StateCodeList = 
    db.MarketingLookup.AsEnumerable().OrderBy(x => x.State).Distinct().Select(x => new SelectListItem 
        { 
         Text = x.State, 
         Value = x.State 
        }).ToList(); 

ответ

2

Для того, чтобы Distinct иметь эффект, ваша последовательность должна содержит объекты типа, который реализует интерфейс IEquatable, если тип пользовательского типа.

Как указано here:

Четкие возвращает различные элементы последовательности , используя компаратор равенство по умолчанию для сравнения значений.

Один из способов, чтобы избежать выше, так как я могу заключить, что вам не нужен весь объект, а один свойство этого, будет проецировать каждый элемент вашей последовательности в Division, а затем сделать OrderBy и вызова Distinct:

var divisions = db.MarketingLookup.AsEnumerable() 
            .Select(ml=>ml.Division) 
            .OrderBy(division=>division) 
            .Distinct() 
            .Select(division => new SelectListItem 
            { 
            Text = division, 
            Value = division 
            }).ToList(); 

Для получения дополнительной документации по этому вопросу, пожалуйста, посмотрите here.

+0

Awesome, спасибо за объяснение !! Одно быстрое редактирование - «Текст» и «Значение» просто необходимо было применить к 'x', а не' x.Division', так как «x» было присвоено значение, которое я ищу. – NealR

+0

@NealR вы приветствуете чувака. Я рад, что помог! – Christos

+0

@NealR Я только что видел редактирование вашего комментария, и я исправил его. Большое спасибо. – Christos

1

Альтернативный вариант (и тот, который часто использует наша компания/команда) заключается в добавлении статического метода расширения (у нас есть библиотека расширений).

public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) 
{ 
    HashSet<TKey> seenKeys = new HashSet<TKey>(); 
    return source.Where(e => seenKeys.Add(keySelector(e))); 
} 

Какой из них можно назвать следующим образом;

var divisions = db.MarketingLookup.AsEnumerable().DistinctBy(d => d.PrimaryKey) 
    .Select(x => new SelectListItem { Text = x.Division, Value = x.Division }).ToList(); 

Вы можете использовать любое свойство MarketingLookup вы хотите, в DistinctBy() вызове для того, чтобы вытащить нужные записи.

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

  • Нет связанных вопросов^_^