Permalänk
Medlem

LINQ

Hej!

Jag försöker hämta ett attribut(grundbelopp) för en specifik försäkring. Dessa är kopplade genom försäkringstyp som ni ser. Jag är inte säker på att något grundbelopp sparats för försäkringen än men det är på detta sättet jag behöver kunna hitta det i så fall, men jag får följande felmeddelande: LINQ to Entities does not recognize the method 'Datalager.FörsäkringGrundbelopp get_Item(Int32)' method, and this method cannot be translated into a store expression.

Försöker returnera grunbeloppet som en double då det är den datatypen den har.

Såhär ser koden ut:

public double HämtaGrundbeloppPersonförsäkring(int i) { using (var db = new Model1Container()) { var query = (from x in db.PersonFörsäkringSet //join typ in db.FörsäkringstypSet on x.FörsäkringstypFörsäkringstypID equals typ.FörsäkringstypID //join försäk in db.PersonFörsäkringSet on typ.FörsäkringstypID equals försäk.FörsäkringstypFörsäkringstypID where x.PFörsäkringID == i select x.Försäkringstyp.FörsäkringGrundbelopp.ToList()[0].Grundbelopp); return query.FirstOrDefault(); } }

Permalänk
Medlem

Lite svårt att testa utan att se hur dina modeller ser ut, men något i den här stilen bör fungera

var query = db.PersonFörsäkringSet .Where(x => x.pFörsäkringId == i) .Select(x => x.Försäkringstyp.FörsäkringGrundbelopp).First().Grundbelopp;

Permalänk
Medlem

Första länken från SO förklarar varför du får detta error-meddelande.

https://stackoverflow.com/questions/7259567/linq-to-entities-...

Som ovan är inne på så är din query felskriven så EF inte förstår. Vad jag kan förstå av svaret på SO iaf.

Permalänk
Medlem

Tack!! Jag fick fram ett värde på det sättet men tyvärr inte det värdet jag önskade, men ni verkar ha bra koll så ni kanske kan hjälpa mig med hur jag ska spara rätt objekt kopplat till försäkringen. Jag printscreenar en bild av min modell då vi kör EF model first, och sen hur jag skrivit koden för att ni ska förstå vad jag försöker göra så kanske ni vet varför det inte verkar fungera.
C:\Users\gusta\Desktop\modell.jpg

Använder winform så jag har kopplat en listbox till entiteten försäkringgrundbelopp, jag har kontrollerat och vet att den väljer rätt värde. När jag sedan försöker spara så vet jag inte om det fungerar.. som ni ser är det fler objekt jag försöker koppla(tillval och tillvalgrundbelopp) men får jag det att funka för försäkringgrundbelopp bör det ju gå att göra samma med de andra tänker jag.. såhär har jag gjort för att försöka koppla det försäkringgrunbeloppet jag valt till den nya försäkringen jag försöker skapa:

public void LäggtillPersonförsäkring(string LöpNr, string FörsäkNr, string Premie, DateTime AnkomstDatum, string Betalform, DateTime Förfalldag, int Betalningsår, int Betalningsmånad, int försäktyp, double eventuellprov, int Grundbelopp, string Till, int Grundtillval, int PersAnsId, int Pförsäktag) { using (var db = new Model1Container()) { //skapar en ny personförsäkring PersonFörsäkring personförsäkring = new PersonFörsäkring() { Löpnr = LöpNr, Försäkringsnr = FörsäkNr, Premie = Premie, Ankomstdatum = AnkomstDatum, Betalform = Betalform, Förfallodag = Förfalldag, Betalningsmånad = Betalningsmånad, Betalningsår = Betalningsår, EventuellProvision = eventuellprov }; //hämtar försäkringstyp var försäkty = from typ in db.FörsäkringstypSet where typ.FörsäkringstypID == försäktyp select typ; //och sparar den för försäkringen foreach (var B in försäkty) { Försäkringstyp ftyp; ftyp = B; personförsäkring.Försäkringstyp = B; } //hämtar ansökan var persansökan = from item in db.PersonAnsökanSet where item.PersAnsID == PersAnsId select item; //och sparar den för försäkringen foreach (var item in persansökan) { PersonAnsökan p; p = item; personförsäkring.PersonAnsökan = item; } //hämtar grundbelopp(försäkringstyp) var grundbelopp = from g in db.FörsäkringGrundbeloppSet join r in db.FörsäkringstypSet on g.FörsäkringstypFörsäkringstypID equals r.FörsäkringstypID where g.FörsäkringGrundID == Grundbelopp select g; //sparar den för försäkringen foreach (var g in grundbelopp) { FörsäkringGrundbelopp grund; grund = g; personförsäkring.Försäkringstyp.FörsäkringGrundbelopp.ToList()[0] = g; } //hämtar tillval var tillval = from t in db.TillvalSet where t.Tillvalstyp == Till select t; //och sparar den för försäkringen foreach (var t in tillval) { Tillval x; x = t; personförsäkring.Försäkringstyp.Tillval.ToList()[0] = t; } //hämtar grundbelopp för tillvalet var grundbelopptillval = from y in db.TillvalGrundbeloppSet where y.TillvalgrundID == Grundtillval select y; //och sparar den foreach (var y in grundbelopptillval) { TillvalGrundbelopp u; u = y; personförsäkring.Försäkringstyp.Tillval.ToList()[0].TillvalGrundbelopp.ToList()[0] = y; } //lägger till den nya försäkringen till databasen //och sparar den db.PersonFörsäkringSet.Add(personförsäkring); db.SaveChanges(); } }

Permalänk
Medlem

@lovarn:

Din bild visas inte.
Lite oklart om vad du vill med all kod du postat ovan, är det något specifikt du undrar över eller något som inte fungerar som du tänkt?
Enklaste sättet att testa om det sparas är väl att steppa igenom via debuggern och se om du får det resultatet du önskar, sen kan du kolla i databasen.

Skulle också rekommendera dig att skriva tydligare variabler och helst på engelska eller åtminstone utan åäö. Ibland gör du väldigt onödiga förkortningar och tveksamma val på dina variabel namn:
where typ.FörsäkringstypID == försäktyp,
fick t.ex. kolla i dina inparamtertrar vad försäktyp är för något i detta fall. Bara ett tips för framtiden, för det är inte alltid du själv som ska arbeta med koden du skriver

foreach (var B in försäkty) { Försäkringstyp ftyp; ftyp = B; personförsäkring.Försäkringstyp = B; }

Denna ser lite fishy ut. Du skapar en null variable av Försäkringstyp som du sen assignar värdet från B, sen assignar du personförsäkring.Försäkringstyp också värdet från loop variabeln B. Du använder aldrig ftyp i loopen och vad är B?

foreach (var item in persansökan) { PersonAnsökan p; p = item; personförsäkring.PersonAnsökan = item; }

Samma sak här, om du ska assigna personförsäkring.PersonAnsökan till item så kan du väl göra det direkt i en line, är tanken att det är en lista får du köra add. Nu loopar och assignar du item till en property, så du kommer att skriva över värdet i propertyn vid varje iteration.

Permalänk
Medlem

C:\Users\gusta\Desktop\modell.jpg kopiera denna länken och lägg i sökfältet, jag lyckas inte infoga den på något annat sätt.
Försäkringstyp och personansökan är kopplade CIA foreign key till försäkring och dem sparas precis som dem ska.
Problemet är försäkringgrundbelopp och övriga som inte har det. Då har jag gått genom försäkringstyp för att spara ett objekt av grundbelopp men jag vet inte om det funkar. För den koden jag fick ovan i tidigare inlägg letar upp en försäkrings grundbelopp men jag fick då inte det värdet jag önskar.
Så min fråga är hur jag ”kopplar” ett objekt med ett annat objekt som inte har foreign keys kopplade utan går via en annan entitet.
Såhär försökte jag skriva i koden ovan:

personförsäkring.Försäkringstyp.Försäkringgrundbelopp.ToList()[] = g;

G i detta faller motsvarar ju ID för försäkringgrundbelopp. Jag har gått igenom och satt stopp för att se och rätt värde kommer ner hit och verkar sparas men sen när jag kör den första kod delen(längre upp i tråden) där jag letar upp värdet så fick jag inte rätt värde ändå. Så jag är osäker på om det verkligen sparas eller vart felet hamnar..

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av lovarn:

C:\Users\gusta\Desktop\modell.jpg kopiera denna länken och lägg i sökfältet, jag lyckas inte infoga den på något annat sätt.
Försäkringstyp och personansökan är kopplade CIA foreign key till försäkring och dem sparas precis som dem ska.
Problemet är försäkringgrundbelopp och övriga som inte har det. Då har jag gått genom försäkringstyp för att spara ett objekt av grundbelopp men jag vet inte om det funkar. För den koden jag fick ovan i tidigare inlägg letar upp en försäkrings grundbelopp men jag fick då inte det värdet jag önskar.
Så min fråga är hur jag ”kopplar” ett objekt med ett annat objekt som inte har foreign keys kopplade utan går via en annan entitet.
Såhär försökte jag skriva i koden ovan:

personförsäkring.Försäkringstyp.Försäkringgrundbelopp.ToList()[] = g;

G i detta faller motsvarar ju ID för försäkringgrundbelopp. Jag har gått igenom och satt stopp för att se och rätt värde kommer ner hit och verkar sparas men sen när jag kör den första kod delen(längre upp i tråden) där jag letar upp värdet så fick jag inte rätt värde ändå. Så jag är osäker på om det verkligen sparas eller vart felet hamnar..

Skickades från m.sweclockers.com

Länken fungerar inte då du länkar din lokala C drive. Använd en delningstjänst som imgur.

Behöver se din modell och hur allt är kopplat för att kunna ge ett svar på det. Är det en SQL relationsdatabas du använder? För att kunna få fram önskat belopp matchande en typ så bör tabellerna vara länkade via någon key. Är det many-to-many får du göra en kopplingstabell för det.

Jag är fortfarande inte säker på exakt vad det är som du behöver hjälp med, i koden ovan ser jag "questionable" syntax på ett flertal ställen som i sin tur skulle kunna orsaka problem.
Kan du quota den specifika delen du är osäker på?

Är dock rätt svårt att sitta här och felsöka en metod på 60+ rader där man inte ser något större sammanhang eller vad det är du försöker få fram. Enklast är nog att sätta en breakpoint i metoden och stega igenom och kika på dina variabler.

Hade rekommenderat att dela upp ovan metod i flera mindre metoder och till och med klasser. För nu skapar du instancer, hämtar data från databasen och sparar till databasen i samma metod (SoC & SRP).