Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#]/[wcf] problemen met objecten casten

Pagina: 1
Acties:

  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Hallo!

Laat ik beginnen met zeggen dat ik niet heel veel ervaring heb met programmeren/C#. Ik heb met WCF een service gemaakt die data doorgeeft aan de controller van mijn MVC applicatie, dat werkt prima, tot ik het probeer te doen met een array[].

Ik heb in mijn service een Model waar alle data instaat, hij maakt daar op de volgende manier een Array van:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        public Meters[] GetMetersById(int LocationId)
        {
            {
                Meters[] meter = db.frm_connection_meter.Where(a => a.LocationID.Equals(LocationId) && a.LocationRevision.Equals(0) && a.Revision.Equals(0) && !a.Removed).Select(b => new Meters()
                {
                    ID = b.ID,
                    ParentConnectionID = b.ParentConnectionMeterID,
                    MeterTypeName = b.frm_meter_type.Name,
                    MeterNumber = b.MeterNumber,
                    Description = b.DescriptionFull,
                    StartDate = b.PeriodStart,
                    EndDate = b.PeriodEnd,
                    ConnectionID = b.ConnectionID,
                    IsMain = b.IsMain,
                    Volume = b.frm_connection_meter_year_volume.Where(c => c.Revision.Equals(0) && !c.Removed).OrderBy(f => f.Year).Select(d => d.YearVolume).FirstOrDefault(),
                    EnergyType = b.frm_energy_type.Name,
                    DataTypeID = b.frm_connection_meter_volume.Where(c => c.Revision.Equals(0) && !c.Removed && c.LocationRevision.Equals(0)).Select(d => d.DataTypeID).FirstOrDefault()
                }).ToArray();
                return meter;
            }
        }

Nogmaals, dit principe werkt prima voor een niet-array-object, zoals de locatie:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        public Location GetLocationById(int LocationId)
        {
            {
                Location loc = db.frm_location_address.Where(a => a.Revision.Equals(0) && a.Revision.Equals(0) && !a.Removed && a.ID.Equals(LocationId) && a.LocationRevision.Equals(0)).Select(b => new Location()
                {
                    ID = b.ID,
                    City = b.City,
                    HouseNumber = b.Number,
                    Street = b.Street1,
                    Name = b.frm_location.Name,
                    Type = b.frm_location.frm_location_type.DescriptionShort,
                    ZipCode = b.PostalCode
                }).FirstOrDefault();
                return loc;
            }
        }

In de controller interpreteer ik Location op de volgende manier om mijn model daar te vullen (Location werkt wel):
code:
1
2
3
4
5
6
7
8
9
10
            Location loc = obj.GetLocationById(id);
            MeterOverzichtLocation Location = new MeterOverzichtLocation()
            {
                Name = loc.Name,
                Street = loc.Street,
                Number = loc.HouseNumber,
                City = loc.City,
                ZipCode = loc.ZipCode,
                Type = loc.Type
            };


Nu probeer ik hetzelfde te doen met Meters[], de classes zijn bij allebei de projecten precies hetzelfde, maar nog steeds krijg ik de melding:
Afbeeldingslocatie: http://puu.sh/cFpvs/acd67a2ed6.jpg
Mij lijkt het dat het zo gewoon zou moeten werken, mara dat is helaas niet. Het liefst zou ik het op zo'n soortgelijke manier werkend krijgen, en anders zoiets:
Afbeeldingslocatie: http://puu.sh/cFpyB/875acf470f.png

Ik hoop dat jullie tips/suggesties voor me hebben! Ben hier ondertussen al 5+ uur mee bezig, en het begint vermoeiend te worden ;(

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • JustFogMaxi
  • Registratie: September 2014
  • Laatst online: 24-10 13:43

JustFogMaxi

zzzZzZZzZ

De error zegt het al he. Je probeer een Meters[] in een variable van het type MeterOverzichtMeter[] te stoppen :)

  • DonJunior
  • Registratie: Februari 2008
  • Laatst online: 21:55
De functie "GetMetersById(int LocationId)" retourneert een Meters[]
Je probeert deze in een MeterOverzichMeter[] te stoppen.
Dat gaat niet werken.

*sowieso


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Die functie retourneerd inderdaad een Meters[]
die gevuld is met het volgende
Afbeeldingslocatie: http://puu.sh/cFpLQ/8e865dfd15.png

Die haal ik dus op uit de service en wil ik in MeterOverzichtMeters stoppen, die er ook zo uit ziet:
Afbeeldingslocatie: http://puu.sh/cFpN0/bb410c3a5f.png

Zodat ik MeterOverzichtMeters kan gebruiken in mijn Model die ik naar mijn view toezet, om de opgehaalde meters te laten zien :)

Hoop dat ik een beetje duidelijk kan maken wat ik wil, haha

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • JustFogMaxi
  • Registratie: September 2014
  • Laatst online: 24-10 13:43

JustFogMaxi

zzzZzZZzZ

MeterOverzichtMeter is niet nodig. Je kan een MeterOverzicht classe maken met een List<Meter>.

  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Ik heb dit geknutseld en ga nu debuggen om te testen:P
Afbeeldingslocatie: http://puu.sh/cFqel/e971bde2e1.png

Ik ben bang dat ik het nog niet goed genoeg snap (sorry ;( )

Dit probeerde ik, maar kom er nog niet uit:
Afbeeldingslocatie: http://puu.sh/cFqlv/f7fcd885b1.png

[ Voor 43% gewijzigd door Domih op 06-11-2014 12:17 ]

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • JustFogMaxi
  • Registratie: September 2014
  • Laatst online: 24-10 13:43

JustFogMaxi

zzzZzZZzZ

Moet de Meters classe niet Meter zijn? Want de classe had informatie over 1 meter.

Verder: List<Meter> list = array.ToList(); :) of de webmethod direct een List terug laten geven uiteraard.

[ Voor 18% gewijzigd door JustFogMaxi op 06-11-2014 12:24 ]


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Hij moet Meters zijn, ik ben een meteroverzicht aan het maken van meerdere meters, er zijn in dit geval in de array 6 meters aanwezig.

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

je kan als je het zo wil doen een meter meegeven aan de constructor:

C#:
1
List<MeterOverzichtMeter> meterSummary = list.Select(meter => new MeterOverzichtMeter(meter)).ToList();

Death smiles at us all, all a man can do is smile back.
PSN


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
YakuzA schreef op donderdag 06 november 2014 @ 12:35:
je kan als je het zo wil doen een meter meegeven aan de constructor:

C#:
1
List<MeterOverzichtMeter> meterSummary = list.Select(meter => new MeterOverzichtMeter(meter)).ToList();
Dan moet je wel eerst die constructor maken.

Maar de TS moet eerst snappen dat Types niet zomaar automatisch onderling te converteren zijn. Je service methode levert een Array van Meter objecten terug ( Meter[] ). Het resultaat van de functie zal je dus moeten assignen aan een variabele van dat type. Als je het wil converteren naar een ander type kun je daar inderdaad zelf code voor schrijven.

Voor dit soort conversies tussen verschillende types die hetzelfde representeren gebruik ik vaak AutoMapper, die doet dat aan de hand van convention.

Wat ik mij hier echter afvraag is waarom er uberhaupt geconverteerd moet worden, kan je niet gewoon het type Meter uit je service gebruiken?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Woy schreef op donderdag 06 november 2014 @ 13:51:
[...]

Dan moet je wel eerst die constructor maken.

Maar de TS moet eerst snappen dat Types niet zomaar automatisch onderling te converteren zijn. Je service methode levert een Array van Meter objecten terug ( Meter[] ). Het resultaat van de functie zal je dus moeten assignen aan een variabele van dat type. Als je het wil converteren naar een ander type kun je daar inderdaad zelf code voor schrijven.

Voor dit soort conversies tussen verschillende types die hetzelfde representeren gebruik ik vaak AutoMapper, die doet dat aan de hand van convention.

Wat ik mij hier echter afvraag is waarom er uberhaupt geconverteerd moet worden, kan je niet gewoon het type Meter uit je service gebruiken?
Nope, dat ging helaas niet. omdat de Model die ik naar mijn view toe gooi een ander type verwacht.

Het is me gelukkig inmiddels gelukt met dit stukje (misschien omslachtige) code. Ik ga het voor nu ook zo laten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
            Meters[] list = obj.GetMetersById(id);
            List<MeterOverzichtMeter> meterSummary = list.Select(b => new MeterOverzichtMeter()
            {
                ID = b.ID,
                DataTypeID = b.DataTypeID,
                ConnectionID = b.ConnectionID,
                Description = b.Description,
                EndDate = b.EndDate,
                EnergyType = b.EnergyType,
                IsMain = b.IsMain,
                MeterNumber = b.MeterNumber,
                MeterTypeName = b.MeterTypeName,
                ParentConnectionID = b.ParentConnectionID,
                StartDate = b.StartDate,
                Volume = b.Volume
            }).ToList();
            MeterOverzichtMeter[] meters = meterSummary.ToArray();


In ieder geval heel erg bedankt voor de hulp iedereen! Fijn dat jullie me zo willen helpen :)

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl

Pagina: 1