Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 16 su 16
  1. #11
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,252
    Volendo ci puoi fare un dll in modo da usarla anche in vb.net.
    codice:
    public class ReaderContex<T> : DbContext where T : EntityBase
        {
            string _databasePath;
            public DbSet<T> Info { get; set; }
            public DbSet<TimeConfiguration> TimeConfigurations { get; set; }
            public DbSet<ReadInfo> ReadInfo { get; set; }
            public ReaderContex(string databasePath) { _databasePath = databasePath; }
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseSqlite($"Data Source={ _databasePath}");
            }
            public static bool Update(string URL, string _databasePath, Func<ReaderContex<T>, DateTime, List<T>, bool> Function, TimeSpan? SetDefaultTime=null)
            {
                bool result = false; SetDefaultTime = SetDefaultTime == null ? new TimeSpan(1, 0, 0) : SetDefaultTime;
                try {
                    InitDB(_databasePath);
                    using (var ctx = new ReaderContex<T>(_databasePath)) {
                        var lastRecord = ctx.ReadInfo.OrderByDescending(o => o.Date).FirstOrDefault();
                        var lastUpdate = lastRecord == null ? DateTime.MinValue : lastRecord.Date;
                        var actualTime = ctx.TimeConfigurations.ToList().FirstOrDefault(f => f.From.TimeOfDay <= DateTime.Now.TimeOfDay && f.To.TimeOfDay > DateTime.Now.TimeOfDay);
                        var DefaultTime = actualTime == null ? SetDefaultTime.Value : actualTime.Frequency.TimeOfDay;
                        if (DateTime.Now > lastUpdate.Add(DefaultTime)) {
                            var request = HttpWebRequest.Create(URL);
                            request.ContentType = "text/json";
                            request.Method = "GET";
                            var httpResponse = (HttpWebResponse)request.GetResponse();
                            var StreamReader = new System.IO.StreamReader(httpResponse.GetResponseStream());
                            var responseText = StreamReader.ReadToEnd();
                            List<T> covidClassList = JsonConvert.DeserializeObject<List<T>>(responseText);
                            var needUpdate = Function(ctx, lastUpdate, covidClassList);
                            if (needUpdate)
                                ctx.ReadInfo.Add(new ReadInfo() { Date = DateTime.Now, Update = needUpdate });
                            ctx.SaveChanges();
                            return needUpdate;}}
                } catch { } return result;
            }
            public static bool InitDB(string databasePath)
            {
                bool result = false;
                try { using (var ctx = new ReaderContex<T>(databasePath)) {
                            ctx.Database.EnsureCreated();
                            if (!ctx.TimeConfigurations.Any()){
                                ctx.TimeConfigurations.Add(new TimeConfiguration(){
                                    Frequency = DateTime.Now.Date.Add(new TimeSpan(0, 1, 0)),
                                    From = DateTime.Now.Date.Add(new TimeSpan(18, 0, 0)),
                                    To = DateTime.Now.Date.Add(new TimeSpan(20, 0, 0))
                                }); ctx.SaveChanges();}} result = true;} catch { } return result;
            }
        }
        [Table("ReadingsList")]
        public class ReadInfo : EntityBase
        {
            public DateTime Date { get; set; }
            public bool Update { get; set; }
        }
        [Table("Configuration")]
        public class TimeConfiguration : EntityBase
        {
            public DateTime From { get; set; }
            public DateTime To { get; set; }
            public DateTime Frequency { get; set; }
        }
        public class EntityBase
        {
            [Key]
            public int Id { get; set; }
        }
    In InitDB() puoi vedere come aggiungo Fasce orarie (puoi farlo da qualsiasi punto). Lo faccio per avere sempre almeno una fascia oraria.
    Mentre Update si occupa di controllare se deve aggiornare oppure no in base al tempo e alla frequenza di aggiornamento, e passa alla funzione data nei parametri dal chiamante il contexto, la data dell'ultimo aggiornamento e la lista di nuovi dati appena ottenuti dalla sorgente json, poi dentro la webapi li tratti come vuoi. In questo esempio cancello i vecchi dati e li riscrivo tutti, ma puoi fare in tanti modi. Una volta restituito true alla funzione verra scritto il log di ultimo aggiornamento (ovviamente se restituisci false non vuoi che venga registrato questo aggiornamento).
    Ultima modifica di U235; 04-04-2020 a 07:10 Motivo: indentazione

  2. #12
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,252
    P.S.
    Non è necessario ovviamente creare prima il database (ne file ne eventualmente server), viene creato alla prima chiamata.

    Ultima modifica di U235; 04-04-2020 a 07:22

  3. #13
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,057
    bello! un minimo di elaborazione però. Oltre ai dati giornaliri per provincia, forse si vuol vedere anche la variazione rispetto al giorno precedente
    Pietro

  4. #14
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,252
    Quote Originariamente inviata da pietro09 Visualizza il messaggio
    bello! un minimo di elaborazione però. Oltre ai dati giornalieri per provincia, forse si vuol vedere anche la variazione rispetto al giorno precedente
    Per elaborare ti basta farlo nella funzione dentro alla webapi.
    Dovresti raggruppare i dati per codice_provincia (ad esempio), e dopo gli ordini in maniera crescente. Fatto ciò leggi il secondo e lo confronti con il primo e dovresti riuscire ad ottenere la variazione giornaliera.

    Ovviamente devi aggiungere il dato nel tuo oggetto restituito.
    Ad esempio:
    codice:
    [HttpGet]
            [EnableQuery]
            public IQueryable<Provinciale> Get()
            {
                ReaderContex<Provinciale>.Update(URL, _databasePath, (ctx, lastUpdate, infoList) =>
                {
                    var groupping = infoList.Where(w=>!w.denominazione_provincia.StartsWith("In fase di definizione")).GroupBy(g => g.codice_provincia).ToList();
                    ctx.Info.RemoveRange(ctx.Info);
                    for (int i = 0; i < groupping.Count(); i++)
                    {
                        var orderGroup = groupping[i].OrderBy(o => o.data).ToList();
                        for (int j =0;j< orderGroup.Count();j++)
                            if (j > 0)
                            {
                                orderGroup[j].variazioneGiornaliera = Math.Round((((double)orderGroup[j].totale_casi - (double)orderGroup[j-1].totale_casi) / (double)orderGroup[j-1].totale_casi)*100,2);
                                ctx.Info.Add(orderGroup[j]);
                            }                            
                    }               
                    return true;
                });
                return _context.Info.OrderByDescending(o=>o.codice_provincia).ThenBy(t=>t.data);
            }
    e questa è la classe json modificata:
    codice:
    [Table("Provinciale")]
            public class Provinciale : EntityBase
            {
                public DateTime data { get; set; }
                public string stato { get; set; }
                public int codice_regione { get; set; }
                public string denominazione_regione { get; set; }
                public int codice_provincia { get; set; }
                public string denominazione_provincia { get; set; }
                public string sigla_provincia { get; set; }
                public float lat { get; set; }
                public float _long { get; set; }
                public int totale_casi { get; set; }
                public string note_it { get; set; }
                public string note_en { get; set; }
                public double variazioneGiornaliera { get; set; }
            }
    EDIT:
    ora l'ho buttata giù così per mostrare come fare, ma sto usando il file completo (https://raw.githubusercontent.com/pc...-province.json) e non quello con il solo dato giornaliero (https://raw.githubusercontent.com/pc...ce-latest.json).
    per fare una cosa fatta bene dovresti confrontare il file giornaliero con quello globale, e quando arriva il nuovo lo aggiungi.
    Ultima modifica di U235; 04-04-2020 a 11:59

  5. #15
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,252
    emm piccolo errore che salta subito alla vista:
    codice:
    for (int j =0;j< orderGroup.Count();j++)
                            if (j > 0)
                            {
                                orderGroup[j].variazioneGiornaliera = Math.Round((((double)orderGroup[j].totale_casi - (double)orderGroup[j-1].totale_casi) / (double)orderGroup[j-1].totale_casi)*100,2);
                                ctx.Info.Add(orderGroup[j]);
                            }
    non salva un dato...
    quindi:
    codice:
    for (int j = 0; j < orderGroup.Count(); j++)
                        {
                            if (j > 0)
                                orderGroup[j].variazioneGiornaliera = Math.Round((((double)orderGroup[j].totale_casi - (double)orderGroup[j - 1].totale_casi) / (double)orderGroup[j - 1].totale_casi) * 100, 2);
                            ctx.Info.Add(orderGroup[j]);
                        }
    Inoltre devi eliminare il famigerato NaN...:
    codice:
    for (int j = 0; j < orderGroup.Count(); j++)
                        {
                            if (j > 0)
                                orderGroup[j].variazioneGiornaliera =  Math.Round((((double)orderGroup[j].totale_casi - (double)orderGroup[j - 1].totale_casi) / Math.Max((double)orderGroup[j - 1].totale_casi,1)) * 100, 2);
                 
                            ctx.Info.Add(orderGroup[j]);
                        }
    Ultima modifica di U235; 04-04-2020 a 13:37 Motivo: NaN

  6. #16
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,057
    Me lo studio

    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.