-----------------------------------

Acquista i software ArcGIS tramite Studio A&T srl, rivenditore autorizzato dei prodotti Esri.

I migliori software GIS, il miglior supporto tecnico!

I migliori software GIS, il miglior supporto tecnico!
Azienda operante nel settore GIS dal 2001, specializzata nell’utilizzo della tecnologia ArcGIS e aderente ai programmi Esri Italia Business Network ed Esri Partner Network

-----------------------------------



sabato 30 aprile 2011

LINQPad: Linq ma non solo ...

LINQPad, per chi non lo conosce, è un utilissimo programma che permette di interrogare interattivamente i database mediante LINQ.

LINQPad supporta c# 4.0 ed il framework 4.0:
• LINQ to Objects
• LINQ to SQL e Entity Framework
• LINQ to XML
• Parallel LINQ

E' possibile inoltre interrogare
• OData / WCF Data Services
• SQL Azure, SQLite and MySQL Enterprise Server
• Microsoft StreamInsight
• Microsoft Dynamics CRM
• Mindscape LightSpeed ORM
• Persino il 'vecchio' SQL

LINQPad è fornito anche di moltissimi esempi per imparare LINQ.

Inoltre permette di eseguire istantaneamente espressioni, blocchi di codice o programmi con formattazione dell'output. Questo ti consente di evitare di crearti numerosi progetti di console application per testare le tue espressioni.

LINQPad è free e può anche essere eseguito senza essere installato. La funzione di autocompletamento è invece a pagamento, ma ad un costo molto contenuto.

Innanzitutto, l'interfaccia utente è il client che può interfacciarsi a più server. Per ogni query LINQPad crea un separato server; questa classe è eseguita in un suo proprio dominio di applicazione ed esegue la query in isolamento. Tale isolamento evita che interferisca con altre query e con la UI e consente a LINQPad di assicurare un annullamento della query (mediante un abort del thread) senza influenzare altri domini di applicazione.



LINPad compila le query utilizzando NET's CSharpCodeProvider o VBCodeProvider (in funzione del linguaggio che si utilizza).
Poichè c# e vb sono tipizzati staticamente, oggetti del database ai quali facciamo riferimento, necessitano di DataContext tipizzati. LINQPad, per un discorso di prestazioni, crea dataContext tipizzati al volo utilizzando Reflection.Emit piuttosto che generare e compilare il codice. E' usato LINQ to SQL rispetto a EF perchè il primo è di un ordine di grandezza nella creazione del metamodello quando è istanziato.

Vediamo qualche esempio:

dopo aver effettuato la connessione al nostro database, possiamo fare la nostra interrogazione e vedere immediatamente i risultati.


vedere la relativa forma lambda

vedere la relativa forma SQL

e l'IL


In questo caso vediamo un esempio di LINQ to Objects:


Qui vediamo un esempio utilizzando IronPython. Occorrerà far riferimento preventivamente agli assembly opportuni. Cliccando il tasto F4 si potranno aggiungere gli assembly e i namespace da utilizzare





Vediamo un esempio utilizzando la nuova classe ExpandoObject del framework 4.0



Ma LINQPad mette anche a disposizione alcune sue funzioni per, ad esempio, visualizzare immagini, visualizzare un testo html ecc.
In questo caso vediamo una chiamata alle api chart di google:
http://chart.apis.google.com/chart?cht=p3&chd=s:Uf9a&chs=350x140&chl=January|February|March|April"


Vediamo ora una interrogazione OData / WCF Data Services utilizzando stackoverflow. Nel caso di stackoverflow la chiamata è del tipo è  http://data.stackexchange.com/%3Ccommunity%3E/atom
Clicchiamo su add connection








Infine vediamo l'utilizzo di una libreria ESRI. nel caso specifico la ESRI.ArcGIS.SOESupport.dll:







Qui potete vedere come interrogare twitter

Con la versione beta corrente di LinqPad è possibile aggiungere i propri visualizzatori personalizzati.
Per maggiori dettagli vedete qui.

Qui vediamo un semplice esempio che ho realizzato:


using System;
using System.Globalization;
using System.Text;
using LINQPad;
 
namespace StudioAT.LinqPad
{
    public class Point
    {
        private double x;
        private double y;
        
        private Point()
        {
 
        }
        public Point(double x, double y)
        {
            this.x = x;
            this.y = y;
        }
 
        public double X
        {
           get 
           {
              return this.x;
           }
        }
 
        public double Y
        {
            get
            {
                return this.y;
            }
        }
    }
 
    public static class Extensions
    {
        /// <summary>
        /// Map Mode of Map Control (Microsoft)
        /// </summary>
        public enum MapMode
        {
            /// <summary>
            /// map mode road
            /// </summary>
            Road,
 
            /// <summary>
            /// map mode aerial
            /// </summary>
            Aerial,
 
            /// <summary>
            /// map mode aerial with labels
            /// </summary>
            AerialWithLabels,
 
            /// <summary>
            /// Bird's eye
            /// </summary>
            Birdseye,
 
            /// <summary>
            /// Bird's eye with labels
            /// </summary>
            BirdseyeWithLabels
        }
 
        public static void DisplayBirdsEye(this Point point)
        {
            
            string url = string.Format("http://dev.virtualearth.net/embeddedMap/v1/ajax/{0}?"Enum.GetName(typeof(MapMode), MapMode.BirdseyeWithLabels));
            string pointXY = string.Format("{1}_{0}", point.X.ToString(Helper.CultureInfoUS), point.Y.ToString(Helper.CultureInfoUS));
            string currentCulture = CultureInfo.CurrentUICulture.Name;
            Helper.GetCultureMapControl(ref currentCulture);
 
            UriBuilder uriBuilder = new UriBuilder(new Uri(url));
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("zoomLevel={0}", 10);
            sb.Append('&');
            sb.AppendFormat("center={0}", pointXY);
            sb.Append('&');
            sb.AppendFormat("pushpins={0}", pointXY);
            sb.Append('&');
            ////The heading is represented in geometric degrees with 0 or 360 = North, 90 = East, 180 = South, and 270 = West.
            ////sb.AppendFormat("heading={0}", 0);
            ////sb.Append('&');
            sb.AppendFormat("culture={0}", currentCulture);
            uriBuilder.Query = sb.ToString();
 
            System.Windows.Forms.WebBrowser wb = new System.Windows.Forms.WebBrowser() { ScriptErrorsSuppressed = true };
            wb.Navigate(uriBuilder.Uri.ToString());
            PanelManager.DisplayControl(wb, "Bird's eye");
        }
 
        public static void DisplayStreetView(this Point point)
        {
            System.Windows.Forms.WebBrowser wb = new System.Windows.Forms.WebBrowser() { ScriptErrorsSuppressed = true };
            UriBuilder uriBuilder = new UriBuilder(new Uri("http://samples.sistemigis.it/StreetViewArcMap/panoAvailable.html"));
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("lat={0}", point.Y.ToString(Helper.CultureInfoUS));
            sb.Append('&');
            sb.AppendFormat("long={0}", point.X.ToString(Helper.CultureInfoUS));
            sb.Append('&');
            sb.AppendFormat("width={0}", 600);
            sb.Append('&');
            sb.AppendFormat("height={0}", 400);
            uriBuilder.Query = sb.ToString();
            wb.Navigate(uriBuilder.Uri.ToString());
            PanelManager.DisplayControl(wb, "Street View");
        }
 
    }
 
    /// <summary>
    /// class of helper
    /// </summary>
    public static class Helper
    {
        /// <summary>
        /// culture for lat-long
        /// </summary>
        public static readonly CultureInfo CultureInfoUS = new CultureInfo("en-US");
 
        /// <summary>
        /// culture supported from Map Control (Microsoft)
        /// </summary>
        private static readonly string[] culturesMapControl = new string[] { "nl-BE""en-CA""en-IN""en-GB""en-US""fr-CA""fr-FR""de-DE""it-IT""ja-JP""es-MX""es-ES""es-US" };
 
        /// <summary>
        /// set culture for map control (microsoft)
        /// if current culture isn't supported it's changed with default culture of map control 
        /// </summary>
        /// <param name="currentCulture">current culture</param>
        public static void GetCultureMapControl(ref string currentCulture)
        {
            int pos = Array.BinarySearch<string>(culturesMapControl, currentCulture);
            if (pos < 0)
            {
                currentCulture = CultureInfoUS.Name;
            }
        }
    }
}

Una volta eseguiti i due extension method, è possibile utilizzare i visualizer personalizzati, nel nostro caso Bird's eye e Street View.





Occorre creare un progetto di tipo Class Library ed aggiungere nei riferimenti l'exe di LinqPad evitando di fare un'inutile copia dell'exe durante la compilazione (Copy Local = false)




Per avere pronto il plugin all'uso è possibile impostare come percorso di compilazione la cartella dei plugin di LinqPad.



Per creare e/o impostare questa cartella in LinqPad selezionare la voce Preferences dal menu Edit  (tab Folders)



Tutte le dll e gli exe in questa cartella vengono automaticamente riferiti in LinqPad.