2016-01-06 2 views
1

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

Это строка кода, у меня возникают проблемы с:

tenderName = _vfpTenderTypes.Where(x => x.ID == tenderCode) 
          .Select(x => x.Name).ToString().Trim(); 

У меня есть список объектов (_vfpTenderTypes), каждый объект имеет несколько свойств (ID & Name в данном случае). Я хочу получить имя объекта, где объект ID соответствует указанному номеру (tenderCode).

Когда код запускается получает заполняется ниже текст вместо объектов Имя:

System.Linq.Enumerable + WhereSelectListIterator`2 [Models.TenderType, System.String]

ответ

3

.Select похож на SQL выбрать, вам получить список результатов назад, а не одну строку. Как только вы вызвали .toString(), вы получаете значение по умолчанию Enumerable toString(), а не только результат, который вам нужен. вы можете попробовать использовать первую или Single (в случае, если он является уникальным) вместо

tenderName = _vfpTenderTypes.First(x => x.ID == tenderCode).Name 
+0

Все великие ответы, и я на самом деле узнал кое-что, используя советы от других и глядя вверх LINQ. Этот ответ, похоже, решил мою проблему. Спасибо, много парней! – IrishCrf

3

Попробуйте одно из следующих действий в зависимости от потребностей:

tenderName = _vfpTenderTypes.Where(x => x.ID == tenderCode).Select(x => x.Name.Trim()); 

Или это:

tenderName = _vfpTenderTypes.FirstOrDefault(x => x.ID == tenderCode).Name.Trim();; 
3

Удалить ToString() с конца запроса Linq:

tenderName = _vfpTenderTypes.Where(x => x.ID == tenderCode) 
          .Select(x => x.Name.Trim()); 

Дополнительно:

Вы можете использовать Single или SingleOrDefault методы, если есть только один пункт за Id:

tenderName = _vfpTenderTypes.Where(x => x.ID == tenderCode) 
          .Select(x => x.Name.Trim()) 
          .Single(); 

Кроме того, не забудьте проверить «Отложенное Execeution в Linq», чтобы узнать, как работает Linq.

Объяснение:

Причина этого вывода является то, что вы вызываете ToString() метод для объекта, который будет возвращать из Select() метода, который в этом случае WhereSelectListIterator.

public override IEnumerable<TResult> Select<TResult>(Func<TSource, TResult> selector) { 
       return new WhereSelectEnumerableIterator<TSource, TResult>(source, predicate, selector); 
      } 

И WhereSelectListIterator не имеет никакой реализации ToString метода. И по умолчанию ToString() метод возвращает строковое представление типа экземпляра объекта:

public virtual String ToString() 
    { 
     return GetType().ToString(); 
    } 

System.Linq.Enumerable + WhereSelectListIterator`2 [Models.TenderType, System.String]

2

Потому что они могут быть прикован, LINQ запросы обычно возвращают IEnumerable<TResult>, чтобы получить один результат из исходного набора вы должны использовать метод как First/FirstOrDefault, Single/SingleOrDefault:

var tenderName = _vfpTenderTypes.Where(x => x.ID == tenderCode) 
           .Select(x => x.Name.Trim()).SingleOrDefault(); 

Или:

var tenderName = _vfpTenderTypes.SingleOrDefault(x => x.ID == tenderCode) 
           .Name.Trim(); 
Смежные вопросы