Visual Studio Lightswitch: Agregaatväljade loomine

09.09.2010  |  Gunnar

Kui juba arvutatud väljade kallale sai asutud, siis mingem uhkelt lõpuni välja. Muud asjad on liiga lihtsad, et neid sõnadesse panna. Käesolevas kandes tutvustan oma väikest räpast viisi, kuidas lahendada küsimus agregeeritud väljadega, mille me SQL-is saame kas agregaatfunktsioonide või alampäringute abil. Siin meil sellist luksust otseselt pole, kuid kuniks andmeid liiga palju pole, saame probleemi kiiresti lahendatud.

Näide agregeeritud väärtusega väljadest

Vaatame korra ühte ekraani minu näiterakenduses. Tegemist on ettekannete loendiga, mis annab oma tühises andmekoosseisus mingi esmase idee, kuidas võidukas tulevikus ettekannete loend võiks välja näha. Põhirõhk on esimesel real, mis loendis märgitud.

Lightswitch: Ettekannete loend
Kliki pildil hiirega, et seda originaalsuuruses vaadata.

Vaatluse alla võtame tabeli kaks viimast veergu, kus on osalejate arv ja keskmine punktide arv, mille osalejad on ettekandele andnud. Kes Eneta kommuuniõhtute tagasisidelehti on täitnud, saab vist aru, kuhu auku see pall on sihitud. :)

Mainitud kahe välja väärtused arvutatakse kokku teiste tabelite põhjal. Õigemini seda teist tabelit on täpselt üks, aga arvutusi tehakse kaks erinevat. Lightswitchi rakenduse tasemel simuleeritakse tüüpilisi arvutusi, mis peituvad agregeeritud väljade taga andmebaasis.

Sisemine teostus

Sisemiselt on viidud ka need arvutused LINQ peale üle. Kõige aluseks on Lightswitchi poolt defineeritud andmeteenuse objekt, mille kaudu me andmeid saame küsida. Selle objekti kaudu teeme me tüüpilise LINQ päringu ja tagastame väärtused.

Kuigi siinkohal oleks ehk mugav, kui saaksime kas otse SQL-i midagi saata, ei ole see jällegi otstarbekas – ärme unusta, et meil võib andmeallikaid olla mitu tükki ja need andmeallikad võivad oma andmeid tuua ka SharePointi ja WCF RIA-teenuste käest. Seega täna ja praegu paremat varianti pole kui antud sisemise andmeteenuse kasutamine.

Väljade väärtustamine

Nagu eelpool öeldud sai ja nagu eelmises kandes juttu oli, siis peame oma agregaatväljade väärtused leidma koodi abil. Et paremini asi selge oleks, siis siin on ettekannete tabel Lightswitchi rakenduses.

Lightswitch: Ettekannete tabel
Kliki pildil hiirega, et seda originaalsuuruses vaadata.

Antud tabeli juures on oluliseks väljaks attendees, mis sisaldab infot ettekannet kuulamas käinud inimeste ja nende antud tagasiside kohta. Väli attendee_count annab ettekandel osalenute arvu ja average_point on kuulajaskonna keskmine hinne ettekandele. Kood, mis need väärtused arvutab, on selline.

public partial class session
{
    partial void attendee_count_Compute(ref short result)
    {
        var attendees = this.DataWorkspace.EnetaEventsData.attendees;
        var query = attendees.Where<attendee>(a => a.session.session_id == session_id);
        result = (short)query.Execute().Count();

    }

    partial void average_points_Compute(ref double result)
    {
        var attendees = this.DataWorkspace.EnetaEventsData.attendees;
        var query = attendees.
                        .Where<attendee>(a => a.session.session_id == session_id && a.points> 0)
                        .Execute();

        var count = query.Count();
        var sum = query.Sum(a => a.points);
           
        if (count == 0)
            result = 0;
        else
            result = sum / count;
    }
}

Pole küll ehk viisakaim variant, kuid see-eest toimib kenasti. Loodetavasti on tulevikus võimalik taolisi arvutusi defineerida lihtsamini kui koodi kirjutades.

Kommenteeri

sulge
Saada link e-postiga

© DT 2012 | Creative Commons Attribution-Noncommercial 3.0 License | WordPress