2016-04-18 19 views
0

Ich habe den Code, unter dem gearbeitet, aber wenn ich versuche, die Where Klausel hinzufügen, um die Sammlung, die ich den Fehler zu filtern:Wie filtere ich eine generische Liste?

'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?)

Ich habe versucht, das Objekt zu OfType<Certification> Gießen und das schlug fehl. Ich habe auch versucht, Casting zu IQueryable und das mit einem ähnlichen Fehler fehlgeschlagen. Also überprüfte ich den Typ meiner Zertifizierungsvariablen und es ist "System.Collections.Generic.List``1[[GainesTrader_WCF.Certification, GainesTrader WCF,". Kannst du die Lösung dafür sehen?

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

Welchen Typ gibt 'client.GetCertifications()' zurück? Der Compilerfehler ist korrekt - "Objekt" hat keine 'Where' Methode oder Erweiterungsmethode. Sie müssen den richtigen Sammlungstyp anstelle von "Objekt" verwenden. –

+0

Warum ist dies mit WCF markiert? Es hat nichts mit WCF zu tun. – Tim

+0

Tim. Ich denke, dass es WCF basierend auf meinem variablen Namen vorgeschlagen hat und ich akzeptierte nur, ohne genau darauf zu achten. Ich habe die Tags bearbeitet, um WCF zu entfernen. –

Antwort

1

warum ist die Zertifikate Variable vom Typ Objekt? Sehen Sie sich den WCF-Proxy an und überprüfen Sie den Rückgabetyp. Wenn Sie den Proxy einrichten, sollte Visual Studio alle zugehörigen Typen heruntergeladen haben.

Auch das ist das erste Mal, dass jemand die Where-Erweiterung auf einen Objekttyp angewendet hat. Es ergibt keinen Sinn.

+0

Ich würde D Stanley die richtige Antwort geben, aber er hat nur einen Kommentar gepostet. Dein Kommentar ist nahe an der richtigen Antwort. Ich habe den Variablentyp von Objekt zu Var geändert, wie er vorgeschlagen hat und es hat funktioniert Die Antwort ist einfach: Du hast Recht - es als Objekt zu deklarieren macht keinen Sinn Ich bin noch relativ neu für Linq und Var ist nicht sehr intuitiv für mich. –

1

Sie sollten Ihre certifications Variable werfen IEnumerable<Certification> eingeben:

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

oder

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

Ich versuchte dies und es scheiterte, weil es .OfType nicht erkannt hatte (ich hatte diese Lösung bereits ausprobiert). Also eine schnelle Suche sagte, dass ich eine MVC-Version in meiner web.config brauche. Dieses Projekt war nicht MVC, also war es nicht dort. Also habe ich das MVC-Versions-Tag in web.config hinzugefügt und die Website abgestürzt. Ich kann das einfach "so wie es ist" lassen, da es funktioniert. Ich wollte meine MCAD-Zertifizierungen herausfiltern, aber das ist keine große Sache. Ich möchte nicht stundenlang damit zu tun haben. Wenn Sie eine einfache Lösung sehen, werde ich es versuchen. Vielen Dank. –

+2

'OfType' hat mit MVC null zu tun. Das Problem ist, dass Sie 'Zertifizierungen' als' Objekt' deklariert haben, das keine 'Where' Methode (oder Erweiterung' hat. –

+0

D Stanley, das ist die Lösung. Danke. Ich habe den Objekttyp in var und it geändert –

Verwandte Themen