views:

44

answers:

2

I have own collection DataContracts:

    [DataContract]
public class DzieckoAndOpiekun
{
    public DzieckoAndOpiekun() { }
    public DzieckoAndOpiekun(string dzImie, string dzNazwisko, string opImie, string opNazwisko)
    {
        this.DzieckoImie = dzImie;
        this.DzieckoImie = dzNazwisko;
        this.OpiekunImie = opImie;
        this.OpiekunNazwisko = opNazwisko;
    }

    /// <summary>
    /// Field for Dziecko's Surname
    /// </summary>
    private string dzieckoNazwisko;

    /// <summary>
    /// Field for Dziecko's Name
    /// </summary>
    private string dzieckoImie;

    /// <summary>
    /// Field for Opiekun's Surname
    /// </summary>
    private string opiekunNazwisko;

    /// <summary>
    /// Field for Opiekun's Name
    /// </summary>
    private string opiekunImie;

    /// <summary>
    /// Gets or sets the dziecko nazwisko.
    /// </summary>
    /// <value>The dziecko nazwisko.</value>
    [DataMember]
    public virtual string DzieckoNazwisko
    {
        get { return this.dzieckoNazwisko; }
        set { this.dzieckoNazwisko = value; }
    }

    /// <summary>
    /// Gets or sets the dziecko imie.
    /// </summary>
    /// <value>The dziecko imie.</value>
    [DataMember]
    public virtual string DzieckoImie
    {
        get { return this.dzieckoImie; }
        set { this.dzieckoImie = value; }
    }

    /// <summary>
    /// Gets or sets the opiekun nazwisko.
    /// </summary>
    /// <value>The opiekun nazwisko.</value>
    [DataMember]
    public virtual string OpiekunNazwisko
    {
        get { return this.opiekunNazwisko; }
        set { this.opiekunNazwisko = value; }
    }

    /// <summary>
    /// Gets or sets the opiekun imie.
    /// </summary>
    /// <value>The opiekun imie.</value>
    [DataMember]
    public virtual string OpiekunImie
    {
        get { return this.opiekunImie; }
        set { this.opiekunImie = value; }
    }
}

[DataContract]
public class DzieckoAndOpiekunCollection : IEnumerable<DzieckoAndOpiekun>, IList<DzieckoAndOpiekun>
{
    [DataMember]
    List<DzieckoAndOpiekun> collection = new List<DzieckoAndOpiekun>();

    [DataMember]
    public List<DzieckoAndOpiekun> Collection
    {
        get { return collection; }
        set { collection = value; }
    }

    public IEnumerator<DzieckoAndOpiekun> GetEnumerator()
    {
        return collection.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        throw new System.NotImplementedException();
    }

    public int IndexOf(DzieckoAndOpiekun item)
    {
        return collection.IndexOf(item);
    }

    public void Insert(int index, DzieckoAndOpiekun item)
    {
        collection.Insert(index, item);
    }

    public void RemoveAt(int index)
    {
        collection.RemoveAt(index);
    }

    public DzieckoAndOpiekun this[int index]
    {
        get
        {
            return collection[index];
        }
        set
        {
            collection[index] = value;
        }
    }

    public void Add(DzieckoAndOpiekun item)
    {
        this.collection.Add(item);
    }

    public void AddRange(IList<DzieckoAndOpiekun> collection)
    {
        this.collection.AddRange(collection);
    }

    public void Clear()
    {
        collection.Clear();
    }

    public bool Contains(DzieckoAndOpiekun item)
    {
        return collection.Contains(item);
    }

    public void CopyTo(DzieckoAndOpiekun[] array, int arrayIndex)
    {
        this.collection.CopyTo(array, arrayIndex);
    }

    public int Count
    {
        get { return this.collection.Count; }
    }

    public bool IsReadOnly
    {
        get { return false; }
    }

    public bool Remove(DzieckoAndOpiekun item)
    {
        return this.collection.Remove(item);
    }
}

And use it in my ServiceContract implementation:

 public DzieckoAndOpiekunCollection GetChildAndOpiekunByFirstnameLastname(string firstname, string lastname)
    {
        DataTransfer.ChargeInSchoolEntities db = new DataTransfer.ChargeInSchoolEntities();
        DzieckoAndOpiekunCollection result = new DzieckoAndOpiekunCollection();
        if (firstname == null && lastname != null)
        {
            IQueryable<DzieckoAndOpiekun> resultV = from p in db.Dziecko
                                                    where lastname == p.Nazwisko
                                                    select new DzieckoAndOpiekun(
                                                   p.Imie,
                                                   p.Nazwisko,
                                                   p.Opiekun.Imie,
                                                   p.Opiekun.Nazwisko);
            List<DzieckoAndOpiekun> l = resultV.ToList();
            result.AddRange(l);
        }
        if (firstname != null && lastname != null)
        {
            IQueryable<DzieckoAndOpiekun> resultV = from p in db.Dziecko
                                                    where firstname == p.Imie && lastname == p.Nazwisko
                                                    select new DzieckoAndOpiekun(
                                                   p.Imie,
                                                   p.Nazwisko,
                                                   p.Opiekun.Imie,
                                                   p.Opiekun.Nazwisko);
            List<DzieckoAndOpiekun> l = resultV.ToList();
            result.AddRange(l);
        }
        if (firstname != null && lastname == null)
        {
            IQueryable<DzieckoAndOpiekun> resultV = from p in db.Dziecko
                                                    where firstname == p.Imie
                                                    select new DzieckoAndOpiekun(
                                                   p.Imie,
                                                   p.Nazwisko,
                                                   p.Opiekun.Imie,
                                                   p.Opiekun.Nazwisko);
            List<DzieckoAndOpiekun> l = resultV.ToList();
            result.AddRange(l);
        }
        return result;
    }

Do I something wrong in creating own data contract and sending it ? I ask cause I have errors when consuming method :/ :

An exception occurred during the operation, making the result invalid. Check InnerException for exception details. at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() at SecretaryAppNav.ClientService.GetChildAndOpiekunByFirstnameLastnameCompletedEventArgs.get_Result() at SecretaryAppNav.Views.FindChild.Client_GetChildAndOpiekunByFirstnameLastnameCompleted(Object sender, GetChildAndOpiekunByFirstnameLastnameCompletedEventArgs e)
at SecretaryAppNav.ClientService.Service1Client.OnGetChildAndOpiekunByFirstnameLastnameCompleted(Object state)

+2  A: 

I can't guarantee that this would work, but you are sending the collection twice:

[DataContract]
public class DzieckoAndOpiekunCollection : 
    IEnumerable<DzieckoAndOpiekun>, IList<DzieckoAndOpiekun>
{
    [DataMember]
    List<DzieckoAndOpiekun> collection = new List<DzieckoAndOpiekun>();

    [DataMember]
    public List<DzieckoAndOpiekun> Collection
    {
        get { return collection; }
        set { collection = value; }
    }
...

You should probably only place the DataMember attribute on the field or the property, but not both, since they are exposing the same value.

casperOne
Thank you for information, but unfortunately it don't erase my error, but info should be useful :)
netmajor
A: 

I solve the problem with CollectionDataContract attribute ;)

netmajor
Also don't forget the [DataMember] Attribute!
Flo