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.