DLINQ: Tárolt eljárások visszatérési típusai (VS trükk)

DLINQ-ből tárolt eljárásokat hívni pofon egyszerű: ráncigálni kell egy kicsit a VS dizájnert, míg ki nem pottyan egy metódus, aminek a szintaktikája éppen a tárolt eljáráséval egyezik meg. Az viszont nagyon nem mindegy, hogy a dizájnerben hogyan kattintgatunk, és mivel a jelenlegi bétában nem sok visszajelzést kapunk, íme egy trükk!

Példaként használjuk a Northwind adatbázist, és akarjuk meghívni a következő nagy bonyolultságú tárolt eljárást:

    CREATE PROCEDURE dbo.GetCustomersInCity
    (
        @City nvarchar( 15 )
    )
    AS
        SELECT * 
        FROM Customers
        WHERE City = @City

Van tehát egy string bemenő paraméterünk, válaszként pedig a Customers tábla rekordjait adjuk vissza. Ennek burkolására úgy készíthetünk DLINQ-es metódust, hogy a Visual Studio "Orcas" O/R Designerében dolgozgatunk, ami akkor jelenik meg, ha Linq to SQL File típusú elemet adunk a projekthez. A dizájner mellé nyissuk ki a Server Explorert, majd ragadjuk meg a tárolt eljárásunkat és dobjuk a dizájner jobb felére, mert az a metódusok helye. Ennek eredménye a következő metódus lesz a DataContext osztályunkban (kicsit kipofozva és leegyszerűsítve):

    [StoredProcedure( Name="dbo.GetCustomersInCity" )]
    public IEnumerable<GetCustomersInCity> GetCustomersInCity( 
        [Parameter( Name="@City" )] string City )
    {
        IQueryResults<GetCustomersInCity> result = 
            this.ExecuteMethodCall<GetCustomersInCity>( 
                this, 
                (MethodInfo) MethodInfo.GetCurrentMethod(), 
                City ); 
        return (IEnumerable<GetCustomersInCity>) result;
    }

A problémát a piros aláhúzott típusok jelentik: a VS lelkesen generált egy új osztályt, aminek olyan tulajdonságai vannak, mint amilyen oszlopokkal a tárolt eljárás visszatér és azt elnevezte GetCustomersInCity-nek. Hagyjuk figyelmen kívül egy pillanatra ennek a típusnak a közel sem bájos nevét és koncentráljunk inkább arra, hogy ez nem a Customer típus, hanem egy ugyanolyan szerkezetű, de másik típus! Ugyanez történik akkor is, ha a dizájnerben már van Customer, a VS nem képes rájönni, hogy a kettő szemantikailag azonos.

Lelkesen felcsaphatjuk a Properties ablakot és örülhetünk, amikor meglátjuk, hogy létezik egy Return Type nevű tulajdonság, aminek az értéke éppen (Auto-generated Type), ám az örömünk hamar elillan, amikor rájövünk, hogy ez bizony read-only.

A rejtély kulcsa abban rejlik, hogy nem mindegy, hova ejtjük a Server Explorerből kifogott tárolt eljárást! Előbb tegyük be a Customers táblát a dizájner bal felére, majd utána fogjuk meg a tárolt eljárást és ne a dizájner jobb felére tegyük, hanem a Customers tábla felett engedjük el az egérgombot. Voila, a fenti kódrészletben az aláhúzott generált típus helyett mindenhol Customer fog szerepelni!

Még egy tanulság a fenti kódrészletből: ha azt akarjuk, hogy a metódus paramétereinek casingjére az FxCop ne panaszkodjon, akkor használjunk a tárolt eljárásokban kisbetűs paraméter neveket, különben kénytelen leszünk módosítani a Parameter attribútum Name tulajdonságát.

 

Technorati tags:

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s