2016-04-18 12 views
0

У меня есть код, приведенный ниже, который работает, но когда я пытаюсь добавить пункт Where для фильтрации коллекции я получаю ошибку:Как фильтровать общий список?

'object' does not contain a definition for 'Where' and no extension method 'Where' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

Я попытался заливкой объект OfType<Certification> и не удалось. Я также попробовал кастинг до IQueryable, и это не удалось с аналогичной ошибкой. Поэтому я проверил тип моей переменной сертификатов, и это "System.Collections.Generic.List``1[[GainesTrader_WCF.Certification, GainesTrader WCF,". Вы видите решение этого?

GainesTrader_WCF.Service1 client = new GainesTrader_WCF.Service1(); 
    object certifications = client.GetCertifications(); 
    //var filtered = certifications.OfType<Certification>().Where(o => o.CertificationAcronym == "MCSD"); 
    var filtered = certifications.Where(o => o.CertificationAcronym == "MCSD"); 
    Certifications.DataSource = filtered; 
    Certifications.DataBind(); 
+2

Какой тип 'client.GetCertifications()' return? Ошибка компилятора - 'object' не имеет метода' Where' или расширения. Вам нужно использовать правильный тип коллекции вместо 'object'. –

+0

Почему это помечено WCF? Это не имеет никакого отношения к WCF. – Tim

+0

Тим. Я думаю, что он предложил WCF на основе моего имени переменной, и я просто принял, не обращая пристального внимания. Я редактировал теги для удаления WCF. –

ответ

1

почему переменная сертификаты объекта типа? Посмотрите на прокси WCF и проверьте тип возврата. Когда вы настраиваете прокси-сервер, визуальная студия должна загружать все связанные типы.

Кроме того, это первый случай, когда я видел, как кто-то применяет метод расширения Where к типу объекта. Это даже не имеет смысла.

+0

Я дал бы правильный ответ D Stanley, но он только отправил комментарий. Ваш комментарий близко к правильному ответу. Я изменил тип переменной с объекта на var, как он предложил, и он сработал. Мне нравится, когда Ответ прост: вы правы - объявляете его, поскольку объект не имеет смысла. Я все еще относительно новичок в Linq, и var не очень интуитивно понятен мне. –

1

Вы должны бросить ваш certifications переменную типа IEnumerable<Certification>:

var filtered = certifications 
    .OfType<IEnumerable<Certification>>() 
    .Where(o => o.CertificationAcronym == "MCSD"); 

или

var certifications = (IEnumerable<Certification>)client.GetCertifications(); 
var filtered = certifications.Where(o => o.CertificationAcronym == "MCSD"); 
+0

Я пробовал это, и он потерпел неудачу, потому что он не распознал .OfType (я уже пробовал это решение). Поэтому быстрый поиск сказал, что мне нужна версия MVC в моем web.config. Этот проект не был MVC, поэтому его там не было. Поэтому я добавил тег версии MVC в web.config, и он разбил веб-сайт. Я могу просто оставить это «как есть», так как он работает. Я хотел отфильтровать мои сертификаты MCAD, но это не имеет большого значения. Я не хочу тратить часы на отладку. Если вы увидите легкое исправление, я попробую. Благодарю. –

+2

'OfType' имеет нулевое отношение к MVC. Проблема заключается в том, что вы объявили 'certifications' как' object', который не имеет метода 'Where' (или extension'. –

+0

D Stanley, то есть решение. Спасибо. Я изменил тип объекта на var и его –

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