Diskuze: IEnumerbale<T> - volanie enumeratoru - LINQ - nacitanie dat pred 'foreach'

C# .NET .NET (C# a Visual Basic) IEnumerbale<T> - volanie enumeratoru - LINQ - nacitanie dat pred 'foreach' American English version English version

Avatar
makis824
Člen
Avatar
makis824:

Zdravim,

oboznamujem sa s implementaciou IEnumerable<T>, IEnumerator<T> a narazil som na jednu "zvlastnost". Mam aplikaciu, kde casto volam storovane procedury. Vystup chcem dalej spracovavat cez LINQ. Vytvoril som si staticku metodu, ktora vracia DataTable resultset SP.

Volanie SP uskutocnujem v:

class EResultSet : IEnumerable<DataRow>
{
    private string procName;
    private Dictionary<string, string> parameters;

    public EResultSet(string procName, Dictionary<string, string> parameters)
    {
        this.procName = procName;
        this.parameters = parameters;
    }

    public IEnumerator<DataRow> GetEnumerator()
    {
        RSEnumerator e = new RSEnumerator(Connect.CallStoredProc(this.procName, this.parameters)); // first proc calling

        while (e.MoveNext())
        {
            yield return e.Current;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

..dalej mam implementovany IEnumerator<Da­taRow> (zdrojak by mal byt v poriadku, nebudem uvadzat).

Teraz to podstatne vid. kod:

//test
StringBuilder sb = new StringBuilder();
var q = from r in new dbcommon.EResultSet("getTypes", null)
        where r["hw_type"].ToString().StartsWith("x")
        select r["hw_type"];

// ..v tomto momente 'q' - (ResultView v debuger) UZ pozna resultSet procky 'getTypes'
// nakolko este nebola volana metoda 'Connect.CallStoredProc(this.procName, this.parameters)'
// z metody public IEnumerator<DataRow> GetEnumerator() ..
foreach (var x in q)
{
    sb.Append(x).Append("\t");
}

..pokial urobim sql-insert (pri zapnutom debugeri) medzi 'var q = ..' a 'foreach' tak sa v samotnom 'foreach' nacitaju aktualne data (teda aj s novou insert polozkou) - co je v poriadku; LEN NEROZUMIEM TOMU ZVLASTNEMU CHOVANIU VID. V COMMENTOCH .

..poprosim fundovanejsich kolegov o osvetlenie, resp. osvietenie :)

Dakujem za pomoc

R.

 
Odpovědět 7.7.2014 14:37
Avatar
Odpovídá na makis824
Andrej Farkaš:

Pokiaľ viem (môžem sa mýliť), tak LINQ ti v podstate iba "uchováva" len telo procedúry, pokým sa nepýtaš na jej výsledok a to presne spravíš v debuggeri, keď naň nakukneš. Spustíš ju.
Myslím, že je to takto, ale ako vravím, môžem sa mýliť.

Nahoru Odpovědět  +1 7.7.2014 21:22
Live. Love. Learn.
Avatar
makis824
Člen
Avatar
Odpovídá na Andrej Farkaš
makis824:

Vdaka! ..tak ako pises, ResultView sa naplni az ked explicitne v debuggeri vyvolam GetEnumerator()

R.

 
Nahoru Odpovědět 9.7.2014 16:02
Avatar
Milan Křepelka
Redaktor
Avatar
Odpovídá na Andrej Farkaš
Milan Křepelka:

Je to jak píšeš. Linq si jenom "přechroustává" dotaz do svého zdroje, ale k vlastnímu spuštění dochází až při reálném dotazu na ten výsledek.

 
Nahoru Odpovědět 9.7.2014 18:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.