LINQPad 方法

有没有人有LINQPad扩展方法和方法的完整列表,如

.Dump() SubmitChanges() 

LINQPad定义了两个扩展方法(在LINQPad.Extensions中),即Dump()Disassemble()Dump()使用LINQPad的输出格式化程序写入输出窗口,并重载以允许您指定标题:

 typeof (int).Assembly.Dump (); typeof (int).Assembly.Dump ("mscorlib"); 

您还可以指定最大recursion深度来覆盖5个级别的默认值:

 typeof (int).Assembly.Dump (1); // Dump just one level deep typeof (int).Assembly.Dump (7); // Dump 7 levels deep typeof (int).Assembly.Dump ("mscorlib", 7); // Dump 7 levels deep with heading 

反汇编()将任何方法反汇编到IL ,以stringforms返回输出:

 typeof (Uri).GetMethod ("GetHashCode").Disassemble().Dump(); 

除了这两个扩展方法外,LINQPad.Util中还有一些有用的静态方法。 这些logging在自动完成中,包括:

  • Cmd – 执行一个shell命令或外部程序
  • CreateXhtmlWriter – 创build使用LINQPad的Dump()格式化程序的文本编写器
  • SqlOutputWriter – 返回写入SQL输出窗口的文本编写器
  • GetMyQueriesGetSamples – 返回表示已保存查询/样本的对象集合(例如,使用“编辑”|“全部search”执行search)
  • 突出显示 – 包装对象,使其在转储时以黄色突出显示
  • Horizo​​ntalRun – 让您在同一行上转储一系列对象

LINQPad还提供了HyperLinq类。 这有两个目的:第一个是显示普通的超链接:

 new Hyperlinq ("www.linqpad.net").Dump(); new Hyperlinq ("www.linqpad.net", "Web site").Dump(); new Hyperlinq ("mailto:user@domain.com", "Email").Dump(); 

你可以把它和Util.HorizontalRun结合起来:

 Util.HorizontalRun (true, "Check out", new Hyperlinq ("http://stackoverflow.com", "this site"), "for answers to programming questions.").Dump(); 

结果:

看看这个网站的编程问题的答案。

HyperLinq的第二个目的是dynamic构build查询:

 // Dynamically build simple expression: new Hyperlinq (QueryLanguage.Expression, "123 * 234").Dump(); // Dynamically build query: new Hyperlinq (QueryLanguage.Expression, @"from c in Customers where c.Name.Length > 3 select c.Name", "Click to run!").Dump(); 

您也可以在LINQPad中编写自己的扩展方法。 转到“我的查询”并单击名为“我的扩展”的查询。 所有查询都可以访问这里定义的任何types/方法:

 void Main() { "hello".Pascal().Dump(); } public static class MyExtensions { public static string Pascal (this string s) { return char.ToLower (s[0]) + s.Substring(1); } } 

在4.46(.02)中引入了新的类和方法 :

  • DumpContainer(类)
  • OnDemand(扩展方法)
  • Util.ProgressBar(class)

此外,Hyperlinq类现在支持一个Action委托,当你点击链接时,它将被调用,允许你在代码中作出反应,而不是链接到外部网页。

DumpContainer是一个类,它可以在输出窗口中添加一个可以replace内容的块。

注意! 请记住在合适的位置将DumpContainer本身.Dump()

使用:

 var dc = new DumpContainer(); dc.Content = "Test"; // further down in the code dc.Content = "Another test"; 

OnDemand是一种扩展方法,不会将其参数的内容输出到输出窗口,而是添加一个可单击的链接,单击该链接时将用该参数的.Dump() ed内容replace该链接。 这对于有时需要的数据结构是非常好的,这些数据结构代价昂贵或占用大量空间。

注意! 请记住.Dump()在适当的位置调用OnDemand的结果。

要使用它:

 Customers.OnDemand("Customers").Dump(); // description is optional 

Util.ProgressBar是一个可以在输出窗口内显示graphics进度条的类,可以在代码移动时更改。

注意! 请记住将.Dump() Util.ProgressBar对象放在适当的位置。

要使用它:

 var pb = new Util.ProgressBar("Analyzing data"); pb.Dump(); for (int index = 0; index <= 100; index++) { pb.Percent = index; Thread.Sleep(100); } 

除了众所周知的myQuery.Dump("Query result:") ,另一个需要提及的特性是Util类:它包含了许多非常方便的方法(其中一些我已经提到,但还有更多)。

另外有意思的是,您可以轻松修改Dump()工作方式

最后,我将向您展示如何使用SubmitChanges()SaveChanges() 更改永久 (即插入,更新,删除 LINQ查询)以及如何访问LinqPad的内部连接对象。

为了使它圆润起来,我将向您展示如何在LinqPad(绘制线,位图函数 )中创build简单的二维graphics

所以,这里有一个内置LinqPadfunction的集合(从我自己的工具经验):


。倾倒()

(LinqPad v5.03.08及以上版本提供参数)

所有LinqPad用户都知道并喜欢复杂的.Dump()扩展方法,它会消耗和打印(几乎)所有内容。

但是你知道有几个参数可用吗? 看看这个代码片段:

 var obj=new { a="Hello", b=5, c="World", d=new { y=5, z=10 } }; obj.Dump(description: "1st example", depth: 5, toDataGrid: false, exclude: "b,d"); obj.Dump("2nd example", exclude: "a,c"); obj.Dump("2nd example", exclude: "+b,d"); // new in V5.06.06 beta 

一个例子只打印variablesac ,隐藏bd第二个例子是相反的(注意它只指定了2个可用参数)。 variablesyz不能单独隐藏,因为它们不在顶层。

以下参数可用( 全部是可选的 ):

  • description [string] – 提供转储对象的描述
  • depth [int?] – 限制recursion检查对象的深度
  • toDataGrid [bool] – 如果为true,则输出格式为datagrid而不是RichText
  • exclude [string] – 如果提供逗号分隔的variables列表,它们将从输出中排除(在示例中,“a,c”:显示bdac隐藏)
  • exclude [+]前缀exclude [string] – 该前缀反转了exclude参数的逻辑。 这意味着,如果您提供逗号分隔的variables列表,除了指定的variables之外的所有variables都是隐藏的(在示例中为“+ b,d”:显示bd ,隐藏所有其他variables)
  • 商店包括和排除在一个variables(自LinqPad V5.09.04以来新的)属性:
    var x=Util.ToExpando(obj, "a, c", "b, d"); x.Dump();
    第一个string包含要包含的属性列表,第二个string是要排除的列表
  • 展开点击:如果您使用.OnDemand("click me").Dump(); 而不是.Dump() ,它会显示一个链接,您可以点击展开。 有用的,如果你想检查值,例如Util.OnDemand("Customer-ID: " + customerObject.ID.ToString(), ()=>customerObject, false).Dump(); 总是显示默认ID,但只有在感兴趣的情况下才会显示customerObject的详细信息。

有关转储的更高级的主题可以在这里find。


环境

这不是一个LinqPad扩展,而是一个.NET类,但由于它是有用的,我会提到它。 您可以在脚本中获得很多有用的信息,例如:

 Environment.UserDomainName.Dump(); Environment.MachineName.Dump(); Environment.UserName.Dump(); Environment.CurrentDirectory.Dump(); Environment.SystemDirectory.Dump(); 

NB为获取Domain\UserName我将使用System.Security.Principal.WindowsIdentity.GetCurrent().Name
而不是Environment.UserDomainName+@"\"+Environment.UserName


Util.WriteCsv

新:从LinqPad版本v4.45.05(testing版)可用)

 Util.WriteCsv (Customers, @"c:\temp\customers.csv"); 

这将把表Customers的内容写入CSV文件c:\temp\customers.csv 。 你也可以find一个很好的例子,说明如何使用Util.WriteCsv ,然后在Linqpad的结果窗口中显示CSV数据。

提示:

  • 要获取/创build与查询位于同一目录中的CSV文件,可以使用:
    var csvFile=Util.CurrentQueryPath.Replace(".linq", ".csv");

  • 如果表很大,则使用ObjectTrackingEnabled = false; 在写入CSV之前避免将其caching在内存中。

  • 如果你想输出一个XML格式的表格而不是逗号分隔的文件,你可以这样做:

     var xmlFile=Util.CurrentQueryPath.Replace(".linq", ".xml"); var xml = XElement.Load(xmlFile); var query = from e in xml.Elements() where e.Attribute("attr1").Value == "a" select e; query.Dump(); 

    此示例从具有与查询同名的XML文件中返回包含值"a"的属性attr1所有元素,并包含在同一path中。 看看这个链接更多的代码示例。


Util.GetPassword

 var pwd = Util.GetPassword("UserXY"); 

这将从LinqPad内置的密码pipe理器中检索密码。 要创build和更改密码,请打开LinqPad的“文件”菜单中的“密码pipe理器”菜单项 。 如果在运行C#代码时没有保存这样的密码,将会打开一个密码对话框,要求input密码,您可以select通过选中保存密码checkbox来创build并保存密码 (在本例中为“UserXY”的密码将被保存,稍后您可以在密码pipe理器中find该条目)。

优点是,您可以将密码存储在安全创build的Linq脚本中,并分别在Windows用户configuration文件中encryption(作为文件存储在%localappdata%\LINQPad\Passwords中)。 LinqPad使用Windows DPAPI来保护密码。

此外,密码是集中存储的,所以如果您需要更改密码,您可以在菜单中进行设置,并立即应用于您创build的所有脚本。

笔记:

  • 如果您不想保存密码,只需input密码对话框,则可以使用第二个参数,如下所示:
    var pwd = Util.GetPassword("UserXY", true);
    这将取消选中密码对话框中的保存密码checkbox(但是,用户仍然可以检查它并select保存)。

  • 如果您需要将密码存储在SecureString ,则可以使用此帮助程序函数(nb:获取使用的扩展方法.ToSecureString() ,请按照此链接在Stackoverflow – 它也允许您将其转换回来,如果需要) :
    System.Security.SecureString GetPasswordSecure(string Name, bool noDefaultSave=true)
    {
    return Util.GetPassword(Name, noDefaultSave) .ToSecureString();
    }


Util.Cmd

这种方法就像一个命令处理器。 您可以调用您从Windows控制台获知的所有命令。

示例1 – dir:

 Util.Cmd(@"dir C:\"); 

这将输出目录的结果,而不需要.Dump它。 将它存储在一个variables中的优点是你可以使用更多的Linq查询。 例如:

 var path=@"C:\windows\system32"; var dirSwitch="/s/b"; var x=Util.Cmd(String.Format(@"dir ""{0}"" {1}", path, dirSwitch), true); var q=from d in x where d.Contains(".exe") || d.Contains(".dll") orderby d select d; q.Dump(); 

这将转储包含在C:\windows\system32文件扩展名为“.exe”或“.dll”的所有文件。 /s开关用于recursion所有子目录, /b用于裸输出格式。 请注意,Cmd方法的第二个参数指定为禁止控制台输出,以便仅使用转储方法显示已过滤的结果。

你可以看到这比你使用dir的通配符更灵活,因为你可以使用Linq查询引擎的全部灵活性。

示例2 – 文本编辑器:

你可以像这样在记事本中打开一个文件:

 var filePath=@"C:\HelloWorld.txt"; Util.Cmd(@"%systemroot%\system32\notepad.exe", filePath); 

Util.Image

显示来自URL的图像。 例:

 var url = "http://chart.apis.google.com/chart?cht=p3&chd=s:Uf9a&chs=350x140&chl=January|February|March|April"; Util.Image(url).Dump(); 

Util.ProgressBar,Util.Progress

使用Util.ProgressBar允许你显示一个进度条。 你可以使用下面的助手类:

 public class ProgressBar { Util.ProgressBar prog; public ProgressBar() { Init("Processing"); } private void Init(string msg) { prog = new Util.ProgressBar (msg).Dump(); prog.Percent=0; } public void Update(int percent) { Update(percent, null); } public void Update(int percent, string msg) { prog.Percent=percent; if (String.IsNullOrEmpty(msg)) { if (percent>99) prog.Caption="Done."; } else { prog.Caption=msg; } } } 

简单地使用它,如下例所示:

 void Main() { var pb1= new ProgressBar(); Thread.Sleep(50); pb1.Update(50, "Doing something"); Thread.Sleep(550); pb1.Update(100); Thread.Sleep(50); } 

您也可以使用Util.Progress来更新LinqPads集成进度条,例如:

 Util.Progress = 25; // 25 percent complete 

不同之处在于,它不会显示在结果窗口中,也不能为其分配消息。


Util.RawHtml

在输出窗口中显示HTML。 例:

 Util.RawHtml (new XElement ("h1", "This is a big heading")).Dump(); 

Hyperlinq,Util.Horizo​​ntalRun

你可以使用这个示例函数

 public void ShowUrl(string strURL, string Title) { Action showURL = delegate() { Process.Start("iexplore.exe", strURL); }; var url = new Hyperlinq(showURL, "this link", true); Util.HorizontalRun (true, "Click ", url, " for details.").Dump(Title); } 

在结果窗口中显示超链接 – 或者打开您喜欢的编辑器等任何操作。 用法:

 ShowUrl("http://stackoverflow.com", "Check out StackOverflow"); 

注意这个函数总是有效的,而new Hyperlinq ("http://myURL", "Web site").Dump(); 对某些types的URL不起作用(尤其是,如果您必须传递像“:1234”这样的端口名称作为URL的一部分)。


Util.ReadLine

从控制台读取input。 例:

 int age = Util.ReadLine<int> ("Enter your age"); 

作为Util.ReadLine<string>()的同义词,你也可以使用Console.ReadLine()

但还有更多! 您可以使用以下代码片断创build一个简单的JSONparsing器 – 例如,如果您想要dynamicparsing和testingJSONstring,那么它非常有用。 使用文本编辑器将下面的代码片段保存为JSONAnalyzer.linq ,然后在LinqPad中打开它(这样可以很容易地实时添加引用):

 <Query Kind="Program"> <Reference>&lt;RuntimeDirectory&gt;\System.Web.Extensions.dll</Reference> <Namespace>System.Web.Script.Serialization;</Namespace> </Query> void Main() { var jsonData=Util.ReadLine<string>("Enter JSON string:"); var jsonAsObject = new JavaScriptSerializer().Deserialize<object>(jsonData); jsonAsObject.Dump("Deserialized JSON"); } 

现在,您可以运行它,只需将剪贴板中的JSONstring粘贴到控制台中 – 它将使用Dumpfunction将其很好地显示为对象,并且您还可以在屏幕上获得parsing器的错误消息以解决问题。 对于debuggingAJAX非常有用。

JSON


Util.ClearResults

如果您需要清除脚本中的结果窗口,请使用:

 Util.ClearResults(); 

在脚本的开始处使用它,或者 – 如果在脚本中运行多个查询,则应在屏幕消隐之前等待用户input(例如,使用Util.ReadLine它)。


自定义.Dump() – ICustomMemberProvider

另外有意思的是,您可以影响.Dump()方法的输出。 只需实现接口ICustomMemberProvider ,例如

 public class test : ICustomMemberProvider { IEnumerable<string> ICustomMemberProvider.GetNames() { return new List<string>{"Hint", "constMember1", "constMember2", "myprop"}; } IEnumerable<Type> ICustomMemberProvider.GetTypes() { return new List<Type>{typeof(string), typeof(string[]), typeof(string), typeof(string)}; } IEnumerable<object> ICustomMemberProvider.GetValues() { return new List<object>{ "This class contains custom properties for .Dump()", new string[]{"A", "B", "C"}, "blabla", abc}; } public string abc = "Hello1"; // abc is shown as "myprop" public string xyz = "Hello2"; // xyz is entirely hidden } 

如果你创build了这个类的一个实例,比如

 var obj1 = new test(); obj1.Dump("Test"); 

那么它将只输出HintconstMember1constMember2myprop ,但不会输出属性xyz

Linqpad转储


在LinqPad中显示一个MessageBox或InputBox

如果你需要显示一个消息框,看看这里怎么做。

例如,您可以使用下面的代码显示一个InputBox

 void Main() { string inputValue="John Doe"; inputValue=Interaction.InputBox("Enter user name", "Query", inputValue); if (!string.IsNullOrEmpty(inputValue)) // not cancelled and value entered { inputValue.Dump("You have entered;"); // either display it in results window Interaction.MsgBox(inputValue, MsgBoxStyle.OkOnly, "Result"); // or as MsgBox } } 

(不要忘记按F4并添加Microsoft.VisualBasic.dll及其命名空间,使其工作)


Util.Run

新:从LinqPad版本v4.52.1(testing版)可用)

允许您从您的脚本内或您自己的.NET程序或Windows服务(通过参考LINQPad4-AnyCPU版本的LINQPad.exe )运行另一个LINQPad脚本。 它就像命令行工具lprun.exe会执行脚本一样执行脚本。

例子:

 const string path=@"C:\myScripts\LinqPad\"; var dummy=new LINQPad.QueryResultFormat(); // needed to call Util.Run Util.Run(path+"foo.linq", dummy); 

本示例运行脚本foo.linq ,其中包含以下示例代码:

 void Main(string[] args) { #if CMD "I'm been called from lprun! (command line)".Dump(); #else "I'm running in the LINQPad GUI!".Dump(); args = new[] { "testhost", "test@foo.com", "test@foo.com", "Test Subject" }; #endif args.Dump("Args"); } 

它允许您区分脚本是从LinqPad GUI内部运行,还是通过lprun.exeUtil.Run

注意:以下变体的调用可能会有所帮助:

 Util.Run(path+"foo.linq", dummy).Dump(); // obviously dumps the script output! Util.Run(path+"foo.linq", dummy).Save(path+"foo.log"); // writes output into log Util.Run(path+"foo.linq", dummy).SaveAsync(path+"foo1.log"); // async output log 

SubmitChanges() – Linq To SQL

如果您使用的是LinqToSQL ,则可能需要更改永久(用于插入/更新/删除操作)。 由于数据库上下文是由LinqPad隐式创build的,因此每次更改后都需要调用SubmitChanges() ,如下所示。

(LinqPad-)Northwind数据库的示例:

 var newP = new Products() { ProductID=pID, CategoryID=cID, ProductName="Salmon#"+pID.ToString() }; Products.InsertOnSubmit(newP); SubmitChanges(); 

更新

 var prod=(from p in Products where p.ProductName.Contains("Salmon") select p).FirstOrDefault(); prod.ProductName="Trout#"+prod.ProductID.ToString(); SubmitChanges(); 

删除

 var itemsToDelete=Products.Where(p=> p.ProductName.Contains("Salmon") || p.ProductName.Contains("Trout")); foreach(var item in itemsToDelete) { Products.DeleteOnSubmit(item); } SubmitChanges(); 

注意:为了获得前面例子的有效ID,你可以使用:

 var cID = (from c in Categories where c.CategoryName.Contains("Seafood") select c).FirstOrDefault().CategoryID; var pID = Products.Count()+1; 

在你调用它们之前。


SaveChanges() – entity framework

如果您正在使用entity framework ,您可能也想要更改永久( 插入/更新/删除操作)。 由于数据库上下文是由LinqPad隐式创build的,因此每次更改后都需要调用SaveChanges() ,如下所示。

这个例子与之前的LinqToSQL基本相同,但是您需要使用SaveChanges() ,而插入和删除方法也已经改变。

 var newP = new Products() { ProductID=pID, CategoryID=cID, ProductName="Salmon#"+pID.ToString() }; Products.Add(newP); SaveChanges(); 

更新

 var prod=(from p in Products where p.ProductName.Contains("Salmon") select p).FirstOrDefault(); prod.ProductName="Trout#"+prod.ProductID.ToString(); SaveChanges(); 

删除

 var itemsToDelete=Products.Where(p=> p.ProductName.Contains("Salmon") || p.ProductName.Contains("Trout")); foreach(var item in itemsToDelete) { Products.Remove(item); } SaveChanges(); 

注意:为了获得前面例子的有效ID,你可以使用:

 var cID = (from c in Categories where c.CategoryName.Contains("Seafood") select c).FirstOrDefault().CategoryID; var pID = Products.Count()+1; 

在你调用它们之前。


这个 – 数据库上下文

LinqPad中数据库上下文通过使用顶部的combobox自动build立,并为您的查询select正确的数据库。 但是有时候,明确地引用它是有用的,例如,如果你从Visual Studio中复制项目中的一些代码,并将其粘贴到LinqPad中。

从Visual Studio项目中获取的代码段很可能看起来像这样:

 var prod=(from p in dc.Products where p.ProductName.Contains("Salmon") select p).FirstOrDefault(); prod.ProductName="Trout#"+prod.ProductID.ToString(); dc.SaveChanges(); 

现在如何处理dc ? 当然,你可以删除每一个dc.事件dc. 在你的查询中,但它更容易。 只需添加

 var dc=this; 

到你的片段的顶部像这样:

 void Main() { var dc=this; var prod=(from p in dc.Products where p.ProductName.Contains("Salmon") select p).FirstOrDefault(); prod.ProductName="Trout#"+prod.ProductID.ToString(); dc.SaveChanges(); } 

和代码将立即工作!


this.Connection

使用LinqPad和OleDb,将数据表转换为Linq对象,Linq中的SQL查询

下面的代码片段可以帮助您使用OleDb的LinqPad。 将System.Data.OleDbSystem.Data程序集添加到查询属性,然后将以下代码粘贴到Main()

 var connStr="Provider=SQLOLEDB.1;"+this.Connection.ConnectionString; OleDbConnection conn = new OleDbConnection(connStr); DataSet myDS = new DataSet(); conn.Open(); string sql = @"SELECT * from Customers"; OleDbDataAdapter adpt = new OleDbDataAdapter(); adpt.SelectCommand = new OleDbCommand(sql, conn); adpt.Fill(myDS); myDS.Dump(); 

现在,将一个SqlServer连接添加到LinqPad并添加Northwind数据库以运行此示例。

注意:如果您只想获取当前选定连接的数据库和服务器,可以使用以下代码片段:

 void Main() { var dc=this; var tgtSrv=dc.Connection.DataSource; var tgtDb=dc.Connection.ConnectionString.Split(';').Select(s=>s.Trim()) .Where(x=>x.StartsWith("initial catalog", StringComparison.InvariantCultureIgnoreCase)) .ToArray()[0].Split('=')[1]; tgtSrv.Dump(); tgtDb.Dump(); } 

你甚至可以将myDS转换成Linq,以下问题的答案显示了如何做到这一点: 在Linq中使用.NET 4dynamic关键字的好例子

再举一个例子:假设你的数据库pipe理员给你一个SQL查询,你想要在LinqPad中分析结果 – 当然在Linq中,而不是在SQL中。 然后你可以做到以下几点:

 void Main() { var dc=this; // do the SQL query var cmd = "SELECT Orders.OrderID, Orders.CustomerID, Customers.CompanyName," +" Customers.Address, Customers.City" +" FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID"; var results = dc.ExecuteQuery<OrderResult>(cmd); // just get the cities back, ordered ascending results.Select(x=>x.City).Distinct().OrderBy(x=>x).Dump(); } class OrderResult { // put here all the fields you're returning from the SELECT public dynamic OrderID=null; public dynamic CustomerID=null; public dynamic CompanyName=null; public dynamic Address=null; public dynamic City=null; } 

在这个例子中,DBA的SELECT查询只是被“扔进”命令文本,结果被City过滤和sorting。
当然,这是一个简化的例子,你的DBA可能会用更复杂的脚本来支持你,但是你会得到这样的想法:只需添加一个支持结果类,它包含SELECT子句中的所有字段,然后就可以直接使用它。
你甚至可以从这个存储过程的结果,并在Linq中使用它。 正如你所看到的,在这个例子中,我不关心数据types,用dynamic来expression它。
所以这实际上就是快速编程能够快速分析数据。 你不应该因为各种原因在你的真实应用程序中这样做(SQL注入,因为你可以从头开始使用EF等)。


PanelManager

在LinqPad中绘制graphics,第1部分

要使用下面的示例,请按F4并将System.Windows.dllSystem.Windows.Forms.dllWindowsFormsIntegration.dllPresentationCore.dllPresentationFramework.dll添加到您的LinqPad程序,并添加命名空间System.Windows.Shapes

一个例子简单地画一条线:

 var myLine = new Line(); myLine.Stroke = System.Windows.Media.Brushes.LightSteelBlue; myLine.X1 = 1; myLine.X2 = 50; myLine.Y1 = 1; myLine.Y2 = 50; myLine.StrokeThickness = 2; PanelManager.DisplayWpfElement(myLine, "Graphic"); 

第二个例子展示了如何使用PanelManager在LinqPad中显示graphics。 通常LinqPad只支持Wpf对象。 这个例子使用System.Windows.Forms.Integration.WindowsFormsHost来创build一个Windows.Forms.PictureBox (它受到了这个启发):

 // needs (F4): System.Windows.dll, System.Windows.Forms.dll, // WindowsFormsIntegration.dll, PresentationCore.dll, PresentationFramework.dll void Main() { var wfHost1 = new System.Windows.Forms.Integration.WindowsFormsHost(); wfHost1.Height=175; wfHost1.Width=175; wfHost1.Name="Picturebox1"; wfHost1.HorizontalAlignment=System.Windows.HorizontalAlignment.Left; wfHost1.VerticalAlignment=System.Windows.VerticalAlignment.Top; System.Windows.Forms.PictureBox pBox1 = new System.Windows.Forms.PictureBox(); wfHost1.Child = pBox1; pBox1.Paint += new System.Windows.Forms.PaintEventHandler(picturebox1_Paint); PanelManager.StackWpfElement(wfHost1, "Picture"); } public string pathImg { get { return System.IO.Path.Combine(@"C:\Users\Public\Pictures\Sample Pictures\", "Tulips.jpg"); } } // Define other methods and classes here public void picturebox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { // https://stackoverflow.com/a/14143574/1016343 System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(pathImg); System.Drawing.Point ulPoint = new System.Drawing.Point(0, 0); e.Graphics.DrawImage(bmp, ulPoint.X, ulPoint.Y, 175, 175); } 

这将创build以下graphics(面板项目“graphics”和“图片”被上面的例子添加):

Showing_Graphic_in_LinqPad

如果要显示Northwind数据库中的图像,可以执行以下操作:
将图像文件名更改为“NorthwindPics.jpg”,然后在第二个示例的 Main()方法开始处添加以下代码:

 var img = (from e in this.Employees select e).FirstOrDefault().Photo.ToArray(); using (FileStream fs1 = new FileStream(pathImg, FileMode.Create)) { const int offset=78; fs1.Write(img, offset, img.Length-offset); fs1.Close(); } 

它将从Employees表读取第一条logging并显示图片。

查看以下链接了解更多信息:
WPF中的形状和基本绘图
LinqPad自定义可视化工具

注意:如果没有PanelManager,也可以实现相同的function,如下面的例子所示:

 // using System.Drawing; using (var image=new Bitmap(100, 100)) using (var gr = Graphics.FromImage(image)) { gr.FillRectangle(Brushes.Gold, 0, 0, 100, 100); gr.DrawEllipse(Pens.Blue, 5, 5, 90, 90); gr.Save(); image.Dump(); } 

它使用.Dump()命令来显示它。 你可以调用image.Dump()多次,它会追加图像。


Windows窗体

在LinqPad中绘制graphics,第2部分

下面的例子,受这篇文章的启发,展示了如何在Linqpad 5中使用C#7实现一个简单的函数绘图器:

 void Main() { fnPlotter(x1: -1, x2: 1, fn: (double x) => Math.Pow(x, 3)).Dump(); } public static Bitmap fnPlotter(double x1=-3, double x2=3, double s=0.05, double? ymin=null, double? ymax=null, Func<double, double> fn = null, bool enable3D=true) { ymin = ymin ?? x1; ymax = ymax ?? x2; dynamic fArrPair(double p_x1 = -3, double p_x2 = 3, double p_s = 0.01, Func<double, double> p_fn = null) { if (p_fn == null) p_fn = ((xf) => { return xf; }); // identity as default var xl = new List<double>(); var yl = new List<double>(); for (var x = p_x1; x <= p_x2; x += p_s) { double? f = null; try { f = p_fn(x); } finally { if (f.HasValue) { xl.Add(x); yl.Add(f.Value); } } } return new { Xs = xl.ToArray(), Ys = yl.ToArray() }; } var chrt = new Chart(); var ca = new ChartArea(); chrt.ChartAreas.Add(ca); ca.Area3DStyle.Enable3D = enable3D; ca.AxisX.Minimum = x1; ca.AxisX.Maximum = x2; ca.AxisY.Minimum = ymin.Value; ca.AxisY.Maximum = ymax.Value; var sr = new Series(); chrt.Series.Add(sr); sr.ChartType = SeriesChartType.Spline; sr.Color = Color.Red; sr.MarkerColor = Color.Blue; sr.MarkerStyle = MarkerStyle.Circle; sr.MarkerSize = 2; var data = fArrPair(x1, x2, s, fn); sr.Points.DataBindXY(data.Xs, data.Ys); var bm = new Bitmap(width: chrt.Width, height: chrt.Height); chrt.DrawToBitmap(bm, chrt.Bounds); return bm; } 

它正在使用LinqPad的function在结果面板中显示Windows窗体。
例
添加参考(按F4
System.Drawing.dllSystem.Windows.Forms.dllSystem.Windows.Forms.DataVisualization.dll
并添加这些程序集中的所有名称空间。


其他提示/进一步阅读:

  • 想在Visual Studio中使用LinqPad? 这是你如何做到这一点 。

  • 需要将LinqPad作为“便携式应用程序”吗? 在这里阅读如何做到这一点。

  • 乔的LinqPad网站永远是一个很好的来源。 在LinqPad内部,“ Help -> What's New新增functionHelp -> What's New为您提供了有关新function和新方法的提示。 LinqPad论坛还包含有用的提示。

  • 也很有帮助: 这篇文章关于Linq(Pad)的debugging。

  • 使用lprun.exe批处理脚本中 运行LINQ查询 阅读这篇文章的更多细节。 例如:
    echo Customers.Take(100) > script.txt
    lprun -lang=e -cxname=CompanyServer.CustomerDb script.txt
    在这个例子中,查询是一个简单的LINQexpression式。 当然,你也可以使用-lang=program来编写复杂的查询来激活程序模式。

  • 您可以编写自己的扩展方法,并将它们存储在LinqPad左侧的“ 我的查询”选项卡中:树的最后一项名为My Extensions ; 双击它打开一个文件,您可以在其中编写可用于所有查询的扩展。 只需将它们放入公共静态类MyExtensions ,然后使用Main()方法为扩展添加testing。

Dump是一个全局扩展方法,SubmitChanges来自DataContext对象,它是一个System.Data.Linq.DataContext对象。

LP只添加转储和反汇编,据我所知。 虽然我强烈build议在Reflector中打开它,看看还有什么可以使用的。 更有趣的事情之一是LINQPad.Util命名空间有LINQPad内部使用的一些好东西。