Antud nipp on kindlasti kogenumatele EF-i (Entity Framework) ja SQL serveri andmebaasi protseduure (stored procedure ehk SP) kasutavatele arendajatele teada. Mina näpin EF-i niimoodi vahelduva eduga ja vahest satub mõne orka otsa lausa mitu korda. See on üks nendest oradest. See on ka selles mõttes ora, et normaalne ja loogiline (loe: oodatud) käitumine oleks teistsugune.
Oletame, et mul on üks andmebaasi protseduur (SP), millel on üks sisend ja kaks väljund parameetrit (kusjuures väljundparameetrite arv antud juhul ei oma mingit tähtsust).
1: CREATE PROCEDURE [dbo].[Test_Sp]
2: @someval INT,
3: @ValueOut INT OUTPUT,
4: @ValueOut2 VARCHAR(50) OUTPUT
5: AS
6: BEGIN
7: SET NOCOUNT ON;
8:
9: SELECT @ValueOut = COUNT(*), @ValueOut2 = 'misiganes'
10: FROM [MingiTabel]
11:
12: SELECT * FROM [MingiTabel]
13: END
Seejärel loon omale EF-i mudeli ning lisan SP antud mudelisse, et oleks strongly typed lähenemine (kood) protseduuri väljakutsumiseks.
Kõik on ilus ja toimib suurepäraselt. Kirjutan ka koodi, mis antud protseduuri välja kutsub ja antud juhul lihtsalt kirjutab konsoolile.
Nüüd antud koodi oodatav väljund lugedes oleks, et “[MingiTabel] ridade arv“, “misiganes”. Päriselt on aga väljundiks:
Nüüd on aeg veidi pead kratsida ja mõelda, mida see EF õige mõtleb. Kui te SQL Profileriga vaataksite, siis te näete et OUTPUT väärtused ilusti tagastatakse. Objekti parameetritesse need aga ei jõua.
Asi nimelt selles, et antud protseduur tagastab kaks asja – select lause tulemuse (loetelu mingitest objektidest) ja need kaks väljund parameetrit. EF eeldab, et oma täie mõistuse juures olles kõigepealt soovite loetelu mälusse saada ja alles seejärel on teil huvi nende väljud parameetrite vastu. ObjectResult<T> tundub olevat käitumise poolest sarnane olevus IQueryable<T> –ga, et andmed laetakse siis kui antud tulemusega soovitakse midagi peale hakata (n-ö lazy loading ehk laisk laadimine) ja alles seejärel on muutuvad väljundparameetrid kättesaadavaks.
Tip! Seega väljundparameetrite kättesaamiseks peate materialiseerima (kui nii võib kirjutada) oma loetelu ja siis on väljund parameetrite väärtused olemas. Toimiv kood näeb välja järgmine:
Ning tulemus.
Edu!