开发者

Sending own data collection in WCF

开发者 https://www.devze.com 2023-01-10 22:15 出处:网络
I have own collection DataContracts: [DataContract] public class DzieckoAndOpiekun { public DzieckoAndOpiekun() { }

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.开发者_StackOverflowNazwisko
                                                    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)


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.


I solve the problem with CollectionDataContract attribute ;)

0

精彩评论

暂无评论...
验证码 换一张
取 消