11.886 messaggi dal 09 febbraio 2002
Contributi
ciao, buona domenica!

karontenero ha scritto:

Scusami ma non capisco, ho passato il mouse sull' ultimo select, ma non vedo i valori di orastart.

Prova semplicemente a stamparli a video.
Quando ti consigliavo di passare il mouse su Select, era soltanto per farti capire quale fosse il tipo ritornato dal metodo. Non intendevo che tu lo facessi durante la fase di debug.

Se vuoi vedere i valori durante il debug, devi invece passare il mouse su elencoStart, che è la variabile a cui si assegna il risultato della query LINQ. Ma devi farlo DOPO che è stata valorizzata. Infatti, partendo dal tuo XML di esempio, io in Visual Studio vedo questo (devi cliccare Results View per far venir fuori i risultati). Mi sembra che la query stia correttamente estraendo i valori cercati.

Comunque, prova tu stesso a stampare a video i risultati della query, così te ne rendi conto in prima persona. Vai così:
Response.Write("Valori ora: " + string.Join(",", elencoStart.ToArray()));


Poi, se vuoi ordinarli e filtrarli, puoi pur sempre continuare la query LINQ che abbiamo costruito finora usando i metodi .OrderBy e .Where.

ciao
Modificato da BrightSoul il 30 giugno 2013 11.51 -

Enjoy learning and just keep making
11 messaggi dal 19 marzo 2013
Ciao,
Buona Domenica anche a te :-)
Funziona:-)

Scusami se sono duro a capire, ma e' la prima volta che uso i file xml.

Ho provato a continuare la query, ma non so come unire quello che ho scritto io al codice che mi hai indicato.

ho fatto cosi:
 
     int OraOn = (from p in elencoStart
                            where p.Start < 1122
                            select p.Start).FirstOrDefault();

     int OraOff = (from p in elencoStart
                             where p.Start == OraOn
                             select p.Stop).FirstOrDefault();

Non so nemmeno se e' giusto, ma in sostanza vorrei trovare il valore appena piu' grande di quello che indico io (in questo caso 1122) e valorizzare con questo la variabile OraOn con il valore di start ed OraOff con il valore di stop.
Non occorre ordinarli in oprdine crescente perché lo faro' nella classe con cui inserisco questi valori.

Potresti aiutarmi per l' ennessima volta per favore?
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

karontenero ha scritto:

Ho provato a continuare la query, ma non so come unire quello che ho scritto io al codice che mi hai indicato.

selezionando i valori di Start siamo andati troppo nello specifico. Dobbiamo fare un passo indietro ed eliminare l'ultimo metodo Select, in modo che possiamo lavorare con gli elementi ora e filtrarli con una where.

A proposito di filtrare...

where p.Start < 1122
Così com'è, questo non potrebbe funzionare perché Start, che è una stringa, non può essere comparato ad 1122 che è un numero intero. E' necessaria una conversione esplicita fra tipi. Direi che per semplicità possiamo convertire Start ad intero, anche se questi valori rappresentano degli orari e sarebbe più appropriato usare la classe TimeSpan.

Dunque prova questa nuova query. Come da te richiesto non ho usato OrderBy. Questo però presuppone che gli elementi ora nel file XML siano già ordinati in maniera crescende per il valore di Start.
var idCanale = "12";
var idTipoGiorno = "feriale";
var valoreStart = 1122;

var elementoOra = xmlDoc
    //di tutti i canali
    .Descendants("canale")
    //prendo quelli che hanno il mio idCanale
    .Where(canale => canale.Attribute("id").Value == idCanale)
    //e poi estraggo tutti i loro TipoGiorno
    .SelectMany(canale => canale.Elements("TipoGiorno"))
    //tra i tanti TipoGiorno scelgo quelli che hanno l'idTipoGiorno indicato
    .Where(tipoCanale => tipoCanale.Attribute("id").Value == idTipoGiorno)
    //poi seleziono tutti i loro elementi ora
    .SelectMany(tipoCanale => tipoCanale.Elements("ora"))
    //Filtro gli elementi ora in base al loro attributo Start
    .Where(ora => int.Parse(ora.Attribute("Start").Value) >= valoreStart)
    //Prendo giusto il primo. Se non ce n'è alcuno, verrà restituito null
    .FirstOrDefault();

//creo delle variabili per start e stop.
var start = string.Empty;
var stop = string.Empty;

// Devo controllare che elementoOra non sia null, per poterne leggere i valori
if (elementoOra != null)
{
    start = elementoOra.Attribute("Start").Value;
    stop = elementoOra.Attribute("Stop").Value;
}
    
//Li stampo a video
Response.Write(string.Format("I valori scelti sono: Start={0}, Stop={1}", start, stop));


ciao
Modificato da BrightSoul il 01 luglio 2013 00.20 -

Enjoy learning and just keep making
1.508 messaggi dal 27 dicembre 2005
Se dovesse servire....

http://msdn.microsoft.com/it-it/library/bb546168%28v=vs.90%29.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1
Codice e manutenibilità troppo complesso.

Fabrizio Canevali
11 messaggi dal 19 marzo 2013
BrightSoul ha scritto:
ciao,

karontenero ha scritto:

Ho provato a continuare la query, ma non so come unire quello che ho scritto io al codice che mi hai indicato.

selezionando i valori di Start siamo andati troppo nello specifico. Dobbiamo fare un passo indietro ed eliminare l'ultimo metodo Select, in modo che possiamo lavorare con gli elementi ora e filtrarli con una where.

A proposito di filtrare...

where p.Start < 1122
Così com'è, questo non potrebbe funzionare perché Start, che è una stringa, non può essere comparato ad 1122 che è un numero intero. E' necessaria una conversione esplicita fra tipi. Direi che per semplicità possiamo convertire Start ad intero, anche se questi valori rappresentano degli orari e sarebbe più appropriato usare la classe TimeSpan.

Dunque prova questa nuova query. Come da te richiesto non ho usato OrderBy. Questo però presuppone che gli elementi ora nel file XML siano già ordinati in maniera crescende per il valore di Start.
var idCanale = "12";
var idTipoGiorno = "feriale";
var valoreStart = 1122;

var elementoOra = xmlDoc
    //di tutti i canali
    .Descendants("canale")
    //prendo quelli che hanno il mio idCanale
    .Where(canale => canale.Attribute("id").Value == idCanale)
    //e poi estraggo tutti i loro TipoGiorno
    .SelectMany(canale => canale.Elements("TipoGiorno"))
    //tra i tanti TipoGiorno scelgo quelli che hanno l'idTipoGiorno indicato
    .Where(tipoCanale => tipoCanale.Attribute("id").Value == idTipoGiorno)
    //poi seleziono tutti i loro elementi ora
    .SelectMany(tipoCanale => tipoCanale.Elements("ora"))
    //Filtro gli elementi ora in base al loro attributo Start
    .Where(ora => int.Parse(ora.Attribute("Start").Value) >= valoreStart)
    //Prendo giusto il primo. Se non ce n'è alcuno, verrà restituito null
    .FirstOrDefault();

//creo delle variabili per start e stop.
var start = string.Empty;
var stop = string.Empty;

// Devo controllare che elementoOra non sia null, per poterne leggere i valori
if (elementoOra != null)
{
    start = elementoOra.Attribute("Start").Value;
    stop = elementoOra.Attribute("Stop").Value;
}
    
//Li stampo a video
Response.Write(string.Format("I valori scelti sono: Start={0}, Stop={1}", start, stop));


ciao
Modificato da BrightSoul il 01 luglio 2013 00.20 -
11 messaggi dal 19 marzo 2013
Ciao, ora sono a lavoro, appena rientro provo.
Grazie
11 messaggi dal 19 marzo 2013
Ciao Totti, grazie del consiglio.

Fabrica, ho provato a scaricare l'applicazione che mi hai consigliato, ma nn la trovo in vs

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.