Avatar billede tigerdyr Nybegynder
18. januar 2015 - 00:33 Der er 8 kommentarer og
2 løsninger

LINQ / Entity Framework og/eller SQL

Hej,

Jeg har brug for assistance, nu har jeg rodet rundt med det her halvanden uge, uden at finde en løsning...

Jeg har en database med disse tabeller (lettere simplificeret):
Libraries: LID, Active, Title
Buildings: BID, Active, Title, FK_LID
Aisles: AID, Active, Title, FK_BID
Shelves: SID, Active, Title, FK_AID
Categories: CID, Active, Title, FK_SID
Books: BoID, Active, Title, FK_CID
Loans: LoanID, FK_LenderID, FK_LID, FK_BID, FK_BoID

Udfordringen er som følger, for at en book er "aktiv" (tilgængelig) skal både book og alle overliggende niveauer i hierakiet være aktive...
Baseret på et input bestående af en Libraries.Title og Loans.FK_LenderID skal jeg have trukket følgende ud:
Buildings.BID, Buildings.Title, Antal aktive books tilhørende den aktuelle building, Antal Loans af aktive books tilhørende den aktuelle building for den angivne lender.

Efter en hulens masse roden rundt med rå SQL, hvor jeg ender med nogle sindsygt grime (og nok voldsomt in-effektive) statements... Udvælger alle aktive books til en temp table, udvælger alle categories der refereres fra de udvalgte books OG categories er aktiv til temp tbl, udvælger alle shelves der refereres fra de udvalgte categories OG shelves er aktiv til temp tbl, udvælger alle ailses der refereres fra de udvalgte shelves OG er aktiv til temp tbl, udvælger alle buildings der refereres fra de udvalgte aisles til temp tbl, udvælger alle libraries der refereres fra de udvalgte buildings OG er aktive.
Udvælger så fra temp de(t) libraries der matcher parameteret og graver retur ned igennem temp tabellerne indtil jeg har en stribe books.BoID som jeg kan lave en count på grupperet i forhold til buildings og returnere sammen med Buildings.BID og Buildings.Title.

Det må sgu da kunne optimeres væsentligt OG samtidigt grave et antal frem fra Loans over hvor mange aktive Books elementer der er.
Jeg kunne virkeligt godt bruge input både i form af rå SQL såvel som i LINQ to Entities (C#).

Håber sgu der er nogle skarpe hjerner herinde der kan gennemskue en løsning på dette :-)
Avatar billede arne_v Ekspert
18. januar 2015 - 01:04 #1
Er det ikke bare at lave en stopr join og saa teste paa active for alt det som skal vaere aktiv?
Avatar billede tigerdyr Nybegynder
18. januar 2015 - 01:31 #2
Det var nogenlunde sådan jeg lagde ud, men jeg synes ikke at det gav mig et korrekt output afhængigt af active state i de forskellige tabeller :-/
Jeg må hellere lige få tjekket op på det igen...
Avatar billede tigerdyr Nybegynder
18. januar 2015 - 17:23 #3
Tja tjo... jeg havde vist misset tjekket på active i en enkel tabel, så det forklarer da i hvert fald hvorfor jeg ikke synes det virkede...

Det giver mig så det meste, med undtagelse af aktive udlån... men det kan måske klares med et outer join og count?
Avatar billede arne_v Ekspert
18. januar 2015 - 18:23 #4
Aktive udlån må vel være bøger som ikke er afleveret d.v.s. hvor afleveringdstidspunk IS NULL.

Uanset diverse status.
Avatar billede arne_v Ekspert
18. januar 2015 - 18:24 #5
Skal FK_LenderID ioevrigt ikke vaere FK_BorrowerID?
Avatar billede tigerdyr Nybegynder
18. januar 2015 - 19:00 #6
haha ja sgu da, godt set :) Det skal selvfølgelig være FK_BorrowerID.

I udgangspunktet ja, så giver det god mening at et aktivt udlån alene baserer sig på en afleveringsdato, men her ønskes tjekket alene udført på en aktiv status (og derved supportere frasolgte (og dermed inaktive) books, enten enkeltvis eller i større portioner).
Jeg har en løsning der baserer sig på et left outer join, men det betyder så desværre også at hele "left" (inkl. joins og where clauses) delen gentages i mit outer join der laver optællingen.

Kønt er det ikke, men det virker da...

Medmindre der er et smukt bud på en fuld SQL der løser problemet, uden en subquery inden i et outer join, så tror jeg vi kan lukke den her :)
Tak for hints :)
Avatar billede arne_v Ekspert
18. januar 2015 - 20:16 #7
Hvis du kun vil have de kative saa skal du vel joine hele vejen og teste paa alle active. Men normal inner join er vel OK.
Avatar billede tigerdyr Nybegynder
18. januar 2015 - 22:11 #8
Points?
Avatar billede arne_v Ekspert
19. januar 2015 - 01:20 #9
gerne
Avatar billede tigerdyr Nybegynder
19. januar 2015 - 15:04 #10
Tak for input, det hjalp mig videre med SQL'en... nu kan jeg kaste mig over LINQ'en :-/
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester