2016-11-07 6 views
0

У меня есть поле в базе данных с дубликатами. Я хочу использовать его в выпадающем списке , и это должно возвращать отдельные данные.Возвращение отдельных данных для поля списка с selectlistItem

Вот метод, который я создал для этого.

  public IEnumerable<SelectListItem> GetBranches(string username) 
       { 
        using (var objData = new BranchEntities()) 
        { 
         IEnumerable<SelectListItem> objdataresult = objData.ABC_USER.Select(c => new SelectListItem 
         { 
          Value = c.BRANCH_CODE.ToString(), 
          Text = c.BRANCH_CODE 
         }).Distinct(new Reuseablecomp.SelectListItemComparer()); 

         return objdataresult; 
        } 

       } 

Это класс, который я использую.

 public static class Reuseablecomp 
      { 
       public class SelectListItemComparer : IEqualityComparer<SelectListItem> 
       { 
        public bool Equals(SelectListItem x, SelectListItem y) 
        { 
         return x.Text == y.Text && x.Value == y.Value; 
        } 

        public int GetHashCode(SelectListItem item) 
        { 
         int hashText = item.Text == null ? 0 : item.Text.GetHashCode(); 
         int hashValue = item.Value == null ? 0 : item.Value.GetHashCode(); 
         return hashText^hashValue; 
        } 
       } 
      } 

Ничего не возвращается. Я получил ошибку ниже. Когда я пробовал базовый запрос без четкого, все работало нормально.

 {"The operation cannot be completed because the DbContext has been disposed."} 
     System.Exception {System.InvalidOperationException} 

Внутреннее исключение = нуль

Вопрос: Как я могу вернуть различные данные для моего выпадающего списка?

ответ

1

Технически ваша проблема может быть решена просто путем добавления .ToList() после вызова Distinct(...). Проблема в том, что запросы оцениваются JIT (как раз вовремя). Другими словами, пока фактические данные, представляемые запросу, не нужны, запрос фактически не отправляется в базу данных. Вызов ToList - одна из таких вещей, которая требует фактических данных, и поэтому будет немедленно оценивать запрос.

Однако основной причиной вашей проблемы является то, что вы делаете это в инструкции using. Когда метод завершается, запрос еще не был оценен, но теперь вы выбрали свой контекст. Поэтому, когда приходит время, чтобы действительно оценить этот запрос, нет никакого контекста для этого, и вы получите это исключение. Вы должны действительно никогда использовать контекст базы данных в сочетании с using. Это всего лишь рецепт катастрофы. В идеале ваш контекст должен быть охвачен областью запросов, и вы должны использовать инъекцию зависимостей, чтобы кормить ее любыми объектами или методами.

Кроме того, для чего это стоит, вы можете просто переместить свой Distinct звонок до вашего Select, и вам больше не понадобится пользовательский IEqualityComparer. Например:

var objdataresult = objData.ABC_USER.Distinct().Select(c => new SelectListItem 
{ 
    Value = c.BRANCH_CODE.ToString(), 
    Text = c.BRANCH_CODE 
}); 

Порядок опсов имеет значение здесь. Вызов Distinct сначала включает его как часть запроса в базу данных, но вызывая его после того, как вы это делаете, запускает его в коллекции в памяти, после оценки. Последнее требует, чтобы пользовательская логика определяла, что представляет собой отдельные элементы в IEnumerable<SelectListItem>, что, очевидно, не обязательно для версии запроса базы данных.

+0

Спасибо. Мне нужно сравнить имя пользователя, например, где username == "ndjgkd". Где я могу включить это в свой код? – user2320476

+0

Не понимаю. «like» сильно отличается от «equals» (==). Что он? И, сравните, как? Что вы хотите сделать? –

+0

извините, я имею в виду равных. это была опечатка – user2320476