Archivio

Archivio per la categoria ‘Linq’

Benchmark MySQL Connector NET Vs DevArt DotConnect For MySQL

30 December 2011 maxgrante Nessun commento

Era da un po’ di tempo che mi chiedevo se l’implementazione di Linq To SQL per mysql di DevArt fosse più efficiente o meno dell’alternativa di casa mysql.

Ho quindi deciso di farmi in casa un benchmark che, sebbene effettuato in modo piuttosto grossolano e rapido ha dato dei risultati abbastanza netti.
Il test è stato eseguito con le seguenti condizioni (da qui capirete che è abbastanza spartano come benchmark):

  • Windows 7 64 BIT
  • mysql 5.1.x 64 BIT per Windows
  • .NET Framework 4.0
  • Utilizzato Cassini al posto di IIS
  • DevArt versione 6.30.185.0
  • mysql Connector NET versione 6.4.4

In pratica ho lanciato due procedure separate con la mia macchina nelle stesse condizioni di lavoro e a distanza di pochissimo tempo, quindi applicativi aperti, musica che suona e via discorrendo :-)

Il test era suddiviso in due componenti, l’esecuzione di 1.000 query su una tabella con campo indicizzato passandogli un valore randomico e l’inserimento di 1.000 record sempre con valori randomici.
In particolare l’inserimento prevedeva il COMMIT ad ogni STATEMENT perché altrimenti non si notava alcuna differenza di performance tra i due drivers.

Di seguito i risultati nudi e crudi:

mysql (utilizzo 27%/30% CPU poi sceso in insert a 13%/15%) 6.4.4

  • Data avvio select: 30/12/2011 18:12:03
  • Data fine select: 30/12/2011 18:12:31
  • Data avvio insert: 30/12/2011 18:12:31
  • Data fine insert: 30/12/2011 18:12:43

DevArt (utilizzo 27%/31% CPU in insert a 13%/17%) 6.30.185.0

  • Data avvio select: 30/12/2011 18:13:21
  • Data fine select: 30/12/2011 18:13:38
  • Data avvio insert: 30/12/2011 18:13:38
  • Data fine insert: 30/12/2011 18:13:44

Tempo SELECT MySQL: 28 secondi
Tempo SELECT DevArt: 17 secondi

Tempo INSERT MySQL: 12 secondi
Tempo INSERT DevArt: 6 secondi

Direi che è abbastanza chiaro che, a parte una lieve differenza nell’utilizzo della CPU (in favore del driver mysql Connector NET meno esoso), la velocità di esecuzione sia delle SELECT che delle INSERT è nettamente in favore di DevArt.

Morale, bene così, almeno non ho toppato driver per un importante progetto che sto sviluppando! :-)

Attivata seconda istanza di Dogs On Web, il canile online

10 December 2011 maxgrante Nessun commento

Tempo fa mi è stato chiesto se potevo realizzare il sito web per un canile sardo, nello specifico la sezione di Carbonia della Lega Nazionale per la Difesa del Cane.
All’epoca oltre ad aver accettato ho avuto un’idea semplice ma credo funzionale, ovvero realizzare una piccola applicazioncina web che consenta la messa online di potenzialmente infiniti siti web per canili.

Ne ho quindi realizzata una prima release che si trova su Source Forge completa di codici sorgenti e di accesso SVN.

E’ ancora embrionale e sicuramente poco sviluppata, però al momento serve già con successo i seguenti due siti web:

Il progetto DogsOnWeb è in ASP.NET e si basa su MVC 2.

Chiunque volesse contribuire allo sviluppo del progetto sarà il benvenuto.
Attualmente non c’è alcun sistema di installazione, pertanto nel caso fatemi sapere e contattatemi via mail a: info@massimo-caselli.com

Portale Azienda Condominio

27 June 2010 maxgrante Nessun commento

Ho appena messo in produzione il portale Azienda Condominio, primo sviluppo realizzato completamente in ASP.NET.
Le tecnologie utilizzate sono:
ASP.NET MVC 2
LINQ TO SQL
SQL SERVER

Inoltre altri componenti sono:
XML, JQUERY, TELERIK MVC, CACHING MVC

Il portale espone moltissime informazioni inerenti ad un modello innovativo di gestione condominiale che forse a molti potrebbero interessare.

Categorie:Asp.Net, Linq, MVC Tag:

Ottenere dati random da una query con LINQ to SQL

13 June 2010 maxgrante Nessun commento

Per un progetto avevo la necessità di estrarre randomicamente i dati presenti in una tabella “Articolo” contenente appunto articoli di categorie diverse.
Per fare questa operazione con classici statement SQL con mysql sarebbe stato abbastanza semplice, bastava utilizzare una query del tipo:

1
SELECT *, RAND() AS rand_value FROM Articolo ORDER BY rand_value;

Con il modello a oggetti di LINQ to SQL, era un filo più complesso (tra l’altro come base dati avevo SQL Server), per cui ho seguito questo howto:
http://weblogs.asp.net/fmarguerie/archive/2008/01/10/randomizing-linq-to-sql-queries.aspx

In buona sostanza è sufficiente andare a creare una nuova view:

1
CREATE VIEW RandomView AS SELECT NEWID() AS ID

E una funziona che possa richiamarla:

1
2
3
4
5
6
7
8
CREATE FUNCTION GetNewId
(
)
RETURNS uniqueidentifier
AS
BEGIN
RETURN  (SELECT ID FROM RandomView)
END

A questo punto il tutto si conclude andando ad aggiornare il modello LINQ to SQL per poter utilizzare la funzione utilizzare la seguente sintassi:

1
2
3
4
5
6
7
8
9
public IEnumerable<articolo> GetArticoliRandom(string AreaCode)
{
    IEnumerable < Articolo >  ArtList = (from art in _model.Articolo
        where art.AreaCode == AreaCode
        orderby _model.GetNewId()
        select art).Take(5);

    return ArtList;
}

Ovviamente il .Take(5) non serve necessariamente ma solo nel mio caso dove dovevo estrarre 5 articoli.

Classe C# per parsing Atom da Blogspot e da PhpBB

Di seguito una semplice classe con due metodi per leggere (o come dicono gli americani, consumare) atom feed.
In entrambi i casi i due metodi ricevono in input l’URL del feed da parsare e ne restituiscono un Dictionary composito (semplicemente perchè mi serviva un tipo di dato di questo tipo).

In teoria sarebbe stato sufficiente l’utilizzo del solo metodo GetAtomItemsBlog() per leggere anche altri Atom, sfortunatamente però il tipo di Atom che esporta PhpBB non viene correttamente letto da questo metodo. Per ovviare al problema ho creato un secondo metodo GetAtomItemsForum() che utilizza la classe SyndicationFeed al posto di Atom10FeedFormatter.
Resta comunque interessante il primo metodo visto che va ad utilizzare la sintassi Linq.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class AtomRssReader
{
    public Dictionary<string , Dictionary<string, string>> GetAtomItemsBlog(string MyUrl)
    {
        XmlReader reader = XmlReader.Create(MyUrl);
        Atom10FeedFormatter atom = new Atom10FeedFormatter();
        Dictionary</string><string , Dictionary<string, string>> Ret = new Dictionary</string><string , Dictionary<string, string>>();
        Dictionary</string><string , string> Temp;
        if (atom.CanRead(reader))
        {
            atom.ReadFrom(reader);
            var items = from item in atom.Feed.Items.OfType<syndicationitem>()
                        select new
                        {
                            Id = item.Id,
                            Title = item.Title.Text,
                            Url = item.Links.Last<syndicationlink>().Uri.AbsoluteUri,
                            Published = item.PublishDate,
                            Updated = item.LastUpdatedTime,
                            Subtitle = item.Summary.Text
                        };
            foreach (var item in items)
            {
                Temp = new Dictionary<string , string>();
                Temp.Add("Title", item.Title);
                Temp.Add("Url", item.Url);
                Temp.Add("Published", Convert.ToString(item.Published.LocalDateTime));
                Temp.Add("Updated", Convert.ToString(item.Updated.LocalDateTime));
                Temp.Add("Subtitle", item.Subtitle);
                Ret.Add(item.Id, Temp);
            }
        }
        reader.Close();

        return Ret;;
    }

    public Dictionary</string><string , Dictionary<string, string>> GetAtomItemsForum(string MyUrl)
    {
        Dictionary</string><string , Dictionary<string, string>> Ret = new Dictionary</string><string , Dictionary<string, string>>();
        XmlReader reader = XmlReader.Create(MyUrl);
        SyndicationFeed feed = SyndicationFeed.Load(reader);
        Dictionary</string><string , string> Temp;

        foreach (var item in feed.Items)
        {
            Temp = new Dictionary</string><string , string>();
            Temp.Add("Title", item.Title.Text);
            Temp.Add("Published", Convert.ToString(item.LastUpdatedTime.LocalDateTime));
            Temp.Add("Updated", Convert.ToString(item.LastUpdatedTime.LocalDateTime));
            Temp.Add("Url", item.Id);
            Temp.Add("Subtitle", ((TextSyndicationContent)item.Content).Text);
            Ret.Add(item.Id, Temp);
        }

        return Ret; ;
    }
}