2011-08-15 3 views
0

Ce n'est pas ça ...Impossible de parcourir la collection

Le problème se situe quelque part dans la façon dont j'utilise le modèle EF Client.

La définition de YeagerTechEntities() est la suivante:

namespace YeagerTechModel 
{ 
    public class YeagerTechEntities : ObjectContext 
    { 
     public YeagerTechEntities(); 
     public YeagerTechEntities(EntityConnection connection); 
     public YeagerTechEntities(string connectionString); 

     public ObjectSet<Customer> Customers { get; } 

     public void AddToCustomers(Customer customer); 
    } 
} 

La définition de DbContext.Customers est la suivante:

public ObjectSet<Customer> Customers { get; } 

Ma méthode dans mon service est défini comme suit:

public IEnumerable<Customer> GetCustomers() 
     { 
      YeagerTechEntities DbContext = new YeagerTechEntities(); 

      IEnumerable<Customer> customer = DbContext.Customers.Where(p => p.City.StartsWith("A")); 

La ligne ci-dessus me donne l'erreur de compilation de temps de conception suivante.

Cannot implicity convert type 'System.Linq.IQueryable<YeagerTechModel.Customer> to System.Collections.Generic.IEnumerable<YeagerTechWcfservice.Customer>' 

Ceci est en partie parce que je l'DataContract suivante dans mon interface pour le Webservice qui a l'espace de noms YeagerTechWcfservice.

[DataContract] 
    public class Customer 
    { 
     [DataMember] 
     public Int16 CustomerID { get; set; } 

     [DataMember] 
     public String Email { get; set; } 

     [DataMember] 
     public String Company { get; set; } 

     [DataMember] 
     public String FirstName { get; set; } 

     [DataMember] 
     public String LastName { get; set; } 

     [DataMember] 
     public String Address1 { get; set; } 

     [DataMember] 
     public String Address2 { get; set; } 

     [DataMember] 
     public String City { get; set; } 

     [DataMember] 
     public String State { get; set; } 

     [DataMember] 
     public String Zip { get; set; } 

     [DataMember] 
     public String HomePhone { get; set; } 

     [DataMember] 
     public String CellPhone { get; set; } 

     [DataMember] 
     public String Website { get; set; } 

     [DataMember] 
     public String IMAddress { get; set; } 

     [DataMember] 
     public DateTime CreatedDate { get; set; } 

     [DataMember] 
     public DateTime? UpdatedDate { get; set; } 
    } 

Si je commente la classe d'interface ci-dessus, l'erreur de compilation de temps de conception va penser que loin qu'il utilise maintenant la classe dans ma classe de YeagerTechModel qui a mon objet client défini. Je pense que c'est le bon comportement que je veux. Toutefois, lorsque j'essaie d'exécuter mon service, je ne peux pas appeler la méthode Getcustomers, car elle comporte un X rouge à côté.

Je crois que je dois dire à mon service Web d'utiliser ma classe YeagerTechModel Customer en tant que DataContract dans l'interface, mais je ne sais pas comment procéder. Voici la classe Customer que j'ai créée dans mon projet YeagerTechModel (qui est un projet distinct, mais dans la même solution que le projet YeagerTechWcfService).

Comment puis-je résoudre ceci où ma méthode va correctement convertir l'objet correct dans ma méthode de service web GetCustomers?

[MetadataType(typeof(CustomerMetaData))] 
    public partial class Customer 
    { 
    } 

    public class CustomerMetaData 
    { 
     public object CustomerID { get; set; } 

     [Required] 
     [StringLength(50)] 
     [DataType(DataType.EmailAddress)] 
     public object Email { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     public object Company { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     public object FirstName { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     public object LastName { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     public object Address1 { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     public object Address2 { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.Text)] 
     public object City { get; set; } 

     [StringLength(2)] 
     [DataType(DataType.Text)] 
     public object State { get; set; } 

     [StringLength(10)] 
     [DataType(DataType.Text)] 
     public object Zip { get; set; } 

     [StringLength(12)] 
     [DataType(DataType.PhoneNumber)] 
     public object HomePhone { get; set; } 

     [StringLength(12)] 
     [DataType(DataType.PhoneNumber)] 
     public object CellPhone { get; set; } 

     [StringLength(100)] 
     [DataType(DataType.Url)] 
     public object Website { get; set; } 

     [StringLength(50)] 
     [DataType(DataType.EmailAddress)] 
     public object IMAddress { get; set; } 

     [Required] 
     [DataType(DataType.Date)] 
     public object CreatedDate { get; set; } 

     [DataType(DataType.Date)] 
     public object UpdatedDate { get; set; } 
    } 

Répondre

0

Essayez d'ajouter .ToList() sur IEnumerable < client client > = DbContext.Customers.Where (p = > p.City.StartsWith ("A")) ToList().

+0

Ce n'est pas ça .... Le problème réside dans mon post complet ci-dessus concernant les espaces de noms. L'instruction suivante obtient la même erreur. IEnumerable client = DbContext.Customers.Where (p => p.CustomerID> 0) .ToList(); Si je change le côté gauche du client IEnumerable , l'erreur de compilation de conception disparaît. Je dois en évaluer d'autres et ensuite poster ... – sagesky36

+0

Comme je l'ai déjà dit, je ne peux pas invoquer cette méthode dans mon service web avec le client de test SCT parce qu'il y a un X rouge dessus. Il dit "cette opération n'est pas supportée dans le client de test WCF car elle utilise le type YeagerTechModel.Customer []". – sagesky36

+0

Alors, comment puis-je utiliser l'espace de noms YeagerTechWcfService au lieu de l'espace de noms YeagerTechModel? Si j'utilise l'espace de noms YeagerTechWcfService, j'obtiens l'erreur de compilation du temps de conception. Si j'utilise l'espace de noms YeagerTechModel, l'erreur de compilation de l'heure de conception disparaît, mais ne peut pas invoquer la méthode en raison du commentaire ci-dessus. – sagesky36

0

Voici la configuration que je l'habitude de résoudre le problème:

projet YeagerTechModel: 1.AJOUT les System.ServiceModel & namespaces System.Runtime.Serialization. 2.Ajoutez l'attribut DataContract pour la classe Customer et ajoutez l'attribut DataMember pour chaque propriété de la classe qui prend également en charge DataAnnotations. C'est une classe séparée de la classe générée EF.

Projet YeagerTechWcfService: 1.Cette classe sera utilisée comme interface pour le service Web; pas celui que j'ai initialement déclaré dans le projet. J'ai supprimé celui-là. Cependant, cela produira un rex X dans l'outil WCF Test Client. C'est ce qui me rejetait. Je peux toujours utiliser l'installation que je décris. C'est juste que je dois utiliser un autre client (projet YeagTech, qui référence ce service web) pour faire les tests. 2.Je peux maintenant utiliser l'extrait de code suivant dans la méthode GetCustomers pour récupérer plusieurs clients. 3. Client potentiel = DbContext.Customers.Where (p => p.CustomerID> 0);

4.Dans mon contrôleur client, je peux maintenant utiliser l'extrait de code suivant pour récupérer les données de la méthode dans mon service Web: 5.NEnumerable customerList = db.GetCustomers();

6.My vue client contient le modèle suivant: 7. @ modèle IEnumerable

Il fonctionne très bien maintenant !!!

Questions connexes