Daily Archives: 2007.03.14. 19:45

Objektum inicializálás LINQ-ban

Aki unja, hogy VS 2005-ben prop-tab-tabbal hozzon létre tulajdonságokat, biztos örömmel olvassa Scott Guthrie március 8-i blogbejegyzését, amelyben a C# 3.0 automatikus tulajdonsággyáráról szól. Ezentúl nem kell időt töltenünk a semmitmondó privát mezők gépelgetésével, sőt kerülgetnünk sem kell azokat, ilyen egyszerűen készíthetünk egy osztályt három tulajdonsággal (mondom tulajdonsággal és nem mezővel!):


    public class Kollega
    {
        public string Vezeteknev { get; set; }
        public string Keresztnev { get; set; }
        public string Varos { get; set; }
    }

Sőt, ezeket a tulajdonságokat egy kényelmesebb szintaxissal lehet inicializálni, ráadásul nem csak egyesével, de gyűjteményben is:


    List<Kollega> kollegak = new List<Kollega>();

    kollegak.Add( new Kollega { Vezeteknev = "Balássy", Keresztnev = "György", Varos = "Budapest" } );
    kollegak.Add( new Kollega { Vezeteknev = "Dávid", Keresztnev = "Zoltán", Varos = "Budapest" } );
    kollegak.Add( new Kollega { Vezeteknev = "Gincsai", Keresztnev = "Gábor", Varos = "Nyíregyháza" } );
    kollegak.Add( new Kollega { Vezeteknev = "Kereskényi", Keresztnev = "Róbert", Varos = "Nyíregyháza" } );
    kollegak.Add( new Kollega { Vezeteknev = "Virág", Keresztnev = "András", Varos = "Kecskemét" } );

Folytassuk ott, ahol Scotty abbahagyta, hozzuk össze ezt a LINQ-kel! Használhatjuk a LINQ-et arra, hogy lekérdezzünk elemeket a fenti gyűjteményből:

    var pestiek = from k in kollegak 
                  where k.Varos == "Budapest" 
                  select k.Vezeteknev;

    foreach( string p in pestiek )
    {
        Console.WriteLine( p );
    }

Ebben az esetben a pestiek nevű változó lényegében egy string gyűjteményt fog tartalmazni. (Ez durva csúsztatás, de nekünk most a lekérdezés visszatérési értéke a lényeg.)

Ha nem egyetlen string értékkel szeretnénk visszatérni, hanem többel, konstruálhatunk belőle egy ojjektumot a selectben:

    var szabolcsiak1 = from k in kollegak 
                       where k.Varos == "Nyíregyháza" 
                       select new { k.Vezeteknev, k.Keresztnev };

Ebben az esetben viszont már nem tudjuk megmondani kódolás közben, milyen típusú lesz a visszatérési érték, tehát gondban vagyunk a foreachnél. Erre találták ki a vart! A C# továbbra is egy erősen típusos nyelv, a var itt nem olyan, mint JavaScriptben, vagy VB-ben a variant, itt a var csak annyit jelent, hogy olyan típust használj kedves fordító, ami az egyenlőségek jobb oldaláról kijön:

    foreach( var s in szabolcsiak1 )
    {
        Console.WriteLine( "{0} {1}", s.Vezeteknev, s.Keresztnev );
    }

Sőt, mivel teljesen új objektumokat hozunk létre, aminek a típusát a select utáni rész alapján definiálja a fordító, semmi akadálya, hogy adjunk neveket a tulajdonságainak:

    var szabolcsiak2 = from k in kollegak
                       where k.Varos == "Nyíregyháza"
                       orderby k.Vezeteknev
                       select new { Csaladnev = k.Vezeteknev, Utonev = k.Keresztnev };

    foreach( var s in szabolcsiak2 )
    {
        Console.WriteLine( "{0} {1}", s.Csaladnev, s.Utonev );
    }

Íme, micsoda fegyvert ad a kezünkbe az object initializer szintaktika és a LINQ összeházasítása!

A korábbiakkal ellentétben ez a kód nem fut a 2006. májusi LINQ preview-val, de a 2007. márciusi Orcas CTP-vel megy remekül, ott lehet kísérletezni.

 

Technorati tags: ,

Advertisements

Word 2007 és a szabványosság

Mióta az Office 2007 megjelent, a Microsoft boldogan lobogtatja a szabványosság zászlóját, elsősorban a fájl formátumokkal kapcsolatban. Sőt, a használhatóságát is szeretik hangoztatni, új felhasználói felület, új szolgáltatások, produktivitás!

Éppen van egy projektünk, ahol ki akartuk használni, hogy lehet közvetlenül bloggolni Word 2007-ből. Némi tanakodás után úgy döntöttünk, hogy a MetaWeblog API-t implementáljuk, amit Virág András kollégám korrektül meg is csinált, Live Writerből megy is csont nélkül. Tesztelésnél kiderült azonban, hogy Word 2007-ből a képfeltöltés elszáll, hibás paraméterezésre utaló hibaüzenettel. Nosza, nekiestünk TcpTrace-szel és kiderült a turpisság!

A MetaWeblog API-ban a képfeltöltésért a newMediaObject függvény felelős, aminek a szabvány szerint a következő a paraméterezése:

metaWeblog.newMediaObject( string blogid, string username, string password, struct mediaobject ) returns struct

Ehelyett a Word 2007 a következő szintaktikával küldi az adatokat:

metaWeblog.newMediaObject( int blogid, string username, string password, struct mediaobject ) returns struct

Az eltérő paraméterezés miatt a függvény hívás természetesen elszáll, és némi guglizás után egyértelművé vált, hogy ez nem a mi szerverünk hibája, mással sem megy. Bugos a Word 2007, pont. A lehetséges megoldás, hogy külön interfészt fejlesztünk a Word 2007-nek és külön mindenki másnak, aki képes helyesen implementálni egy elterjedt szabványt.

Kedves redmondi Word fejlesztők, ezt hogy a túróba sikerült összehoznotok? És főként mivel sikerült tesztelnetek?

 

Technorati tags: ,

Windows Server 2003 SP2 és az ASP.NET

A lelkes TechNet olvasók már GT "tollából" értesülhettek róla, hogy megjelent és letölthető a Windows Server 2003 SP2. Ami miatt ez a hír ide is kívánkozik, hogy máris felbukkant egy KB cikk, ami az ASP.NET alkalmazásokat érinti, konkrétan Server Unavailable hibaüzenetet kaphatunk, ha ész nélkül frissítjük az operációs rendszert a webalkalmazásunk alatt. A megoldás az aspnet_regiis futtatása, persze a megfelelő paraméterekkel. Érdemes legalább átfutni!

 

Technorati tags: