Не удается перебрать коллекцию - PullRequest
0 голосов
/ 15 августа 2011

Это не так ...

Проблема заключается в том, как я использую модель EF Customer.

Определение YeagerTechEntities () следующее:

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);
    }
}

Определение DbContext.Customers следующее:

public ObjectSet<Customer> Customers { get; }

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

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

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

Приведенная выше строка дает мне следующую ошибку времени компиляции.

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

Это отчасти потому, что у меня есть следующий DataContract в моем интерфейсе для веб-сервиса, который имеет пространство имен 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; }
    }

Если я закомментирую вышеприведенный интерфейсный класс, ошибка компиляции во время разработки исчезнет, ​​думая, что теперь он использует класс в моем классе YeagerTechModel, в котором определен мой объект Customer. Я думаю, что это правильное поведение, которое я хочу. Однако, когда я пытаюсь запустить свой сервис, я не могу вызвать метод Getcustomers, потому что рядом с ним стоит красный крестик.

Я чувствую, что должен указать своей веб-службе использовать мой класс клиента YeagerTechModel в качестве DataContract в интерфейсе, но не знаю, как это сделать. Вот класс Customer, который я создал в своем проекте YeagerTechModel (который является отдельным проектом, но в том же решении, что и проект YeagerTechWcfService).

Как я могу решить эту проблему, если мой метод правильно приведёт правильный объект в моем методе веб-службы 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; }
    }

Ответы [ 2 ]

0 голосов
/ 19 августа 2011

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

Проект YeagerTechModel: 1.Добавьте пространства имен System.ServiceModel & System.Runtime.Serialization.2. Добавьте атрибут DataContract для класса Customer и добавьте атрибут DataMember для каждого свойства в классе, который также поддерживает DataAnnotations.Это отдельный класс от класса, сгенерированного EF.

Проект YeagerTechWcfService: 1. Этот класс будет использоваться в качестве интерфейса для веб-службы;не тот, который я первоначально объявил в проекте.Я удалил это.Тем не менее, это приведет к созданию rex X в инструменте тестирования клиента WCF.Вот что меня оттолкнуло.Я все еще могу использовать настройки, которые я описываю.Просто мне нужно использовать другой клиент (проект YeagTech, который ссылается на этот веб-сервис) для проведения тестирования.2. Теперь я могу использовать следующий фрагмент кода в методе GetCustomers для получения нескольких клиентов.3.IQueryable customer = DbContext.Customers.Where (p => p.CustomerID> 0);

4.В моем контроллере Customer теперь можно использовать следующий фрагмент кода для извлечения данных из метода вмой веб-сервис: 5.IEnumerable customerList = db.GetCustomers ();

6.Мой вид клиента содержит следующую модель: 7. @ model IEnumerable

Теперь работает нормально !!!

0 голосов
/ 15 августа 2011

Попробуйте добавить .ToList () на IEnumerable customer = DbContext.Customers.Where (p => p.City.StartsWith ("A")). ToList ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...