誰かがLINQPad拡張メソッドとメソッドの完全なリストを持っていますか?
.Dump()
SubmitChanges()
誰かがLINQPad拡張メソッドとメソッドの完全なリストを持っていますか?
.Dump()
SubmitChanges()
回答:
LINQPad、すなわち、(LINQPad.Extensionsで)2つの拡張メソッドを定義Dump()
し、Disassemble()
。Dump()
LINQPadの出力フォーマッターを使用して出力ウィンドウに書き込み、見出しを指定できるようにオーバーロードされます。
typeof (int).Assembly.Dump ();
typeof (int).Assembly.Dump ("mscorlib");
最大再帰深度を指定して、デフォルトの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
Disassemble()はすべてのメソッドをIL
に逆アセンブルし、出力を文字列で返します。
typeof (Uri).GetMethod ("GetHashCode").Disassemble().Dump();
これらの2つの拡張メソッドに加えて、LINQPad.Utilにはいくつかの便利な静的メソッドがあります。これらはオートコンプリートで文書化され、次のものが含まれます。
LINQPadはHyperLinqクラスも提供します。これには2つの目的があります。1つ目は通常のハイパーリンクを表示することです。
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の2番目の目的は、クエリを動的に構築することです。
// 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で独自の拡張メソッドを作成することもできます。「My Queries」に移動し、「My Extensions」というクエリをクリックします。ここで定義するタイプ/メソッドはすべてのクエリにアクセスできます。
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)では、新しいクラスとメソッドが導入されました。
さらに、Hyperlinqクラスは、リンクをクリックしたときに呼び出されるアクションデリゲートをサポートするようになりました。これにより、外部のWebページにリンクするだけでなく、コード内でそれに応答することができます。
DumpContainer
内容を置き換えることができる出力ウィンドウにブロックを追加するクラスです。
注意!覚えている適切な場所に自分自身。.Dump()
DumpContainer
使用するには:
var dc = new DumpContainer();
dc.Content = "Test";
// further down in the code
dc.Content = "Another test";
OnDemand
パラメータのコンテンツを出力ウィンドウに出力せず、クリック可能なリンクを追加する拡張メソッドです。クリックすると、リンク.Dump()
がパラメータの編集されたコンテンツに置き換えられます。これは、コストがかかる、または多くのスペースを必要とする、時々必要なデータ構造に最適です。
注意!適切な場所.Dump()
で呼び出した結果を忘れないでくださいOnDemand
。
それを使用するには:
Customers.OnDemand("Customers").Dump(); // description is optional
Util.ProgressBar
出力ウィンドウ内にグラフィックプログレスバーを表示できるクラスで、コードの進行に応じて変更できます。
注意!.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:")
、言及すべきもう1つの機能はUtil
クラスです。このクラスには、非常に便利なメソッドが多数含まれています(そのうちのいくつかは前述しましたが、他にもたくさんあります)。
また、Dump()
動作方法を変更できることも興味深い点です。
最後に、またはを使用して変更を永続的に(つまり、 LINQクエリの挿入、更新、削除)する方法と、LinqPadの内部接続オブジェクトにアクセスする方法を示します。SubmitChanges()
SaveChanges()
そしてそれを切り上げるために、LinqPadの内部に単純な2Dグラフィックを作成する方法を示します(線、ビットマップ、または関数の描画)。
だから、ここに組み込みのLinqPad機能のコレクションがあります(ツールでの私自身の経験から):
(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
第一の例のプリントのみ変数a
とc
し、皮革b
とd
、第二の例では、反対の(それは指定することに注意してください使用可能なパラメータのわずか2)を行います。変数y
およびz
は、トップレベルにないため、個別に非表示にすることはできません。
次のパラメーターを使用できます(すべてオプションです)。
description
[string]-ダンプするオブジェクトの説明を提供しますdepth
[int?]-オブジェクトを再帰的に検査する深さを制限しますtoDataGrid
[bool]-trueの場合、出力はリッチテキストではなくデータグリッドとしてフォーマットされますexclude
[文字列] -あなたは変数のカンマ区切りのリストを提供する場合、彼らは(例では「C」を:出力から除外されるb
とd
示され、a
そしてc
隠されています)exclude
[string] with "+"プレフィックス-プレフィックスはexcludeパラメータのロジックを反転します。つまり、変数のコンマ区切りリストを指定すると、指定されたものを除くすべてが非表示になります(例では "+ b、d":b
とd
表示され、他はすべて非表示になっています)。var x=Util.ToExpando(obj, "a, c", "b, d"); x.Dump();
.OnDemand("click me").Dump();
代わりにを使用すると.Dump()
、クリックして展開できるリンクが表示されます。値を検査する場合、たとえばUtil.OnDemand("Customer-ID: " + customerObject.ID.ToString(), ()=>customerObject, false).Dump();
デフォルトで常にIDを表示customerObject
するが、興味がある場合にのみ詳細を明らかにする場合に役立ちます。これは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
。
(新規:LinqPadバージョンv4.45.05(ベータ)以降で使用可能)
Util.WriteCsv (Customers, @"c:\temp\customers.csv");
これにより、テーブルの内容がCustomers
CSVファイルに書き込まれますc:\temp\customers.csv
。またUtil.WriteCsv
、Linqpadの結果ウィンドウのCSVデータを使用して表示する方法の良い例もここにあります。
ヒント:
クエリと同じディレクトリにあるCSVファイルを取得/作成するには、次を使用できます。
var csvFile=Util.CurrentQueryPath.Replace(".linq", ".csv");
テーブルが大きい場合はObjectTrackingEnabled = false;
、CSVを書き込む前に使用して、メモリにキャッシュされないようにします。
テーブルをカンマ区切りファイルではなく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ファイルからattr1
の値を含む属性を持つすべての要素を返します"a"
。その他のコードサンプルについては、このリンクを確認してください。
var pwd = Util.GetPassword("UserXY");
これにより、LinqPadの組み込みパスワードマネージャーからパスワードが取得されます。パスワードを作成&変更するには、開いて「パスワードマネージャー」メニュー項目をして「ファイル」メニュー LinqPadの。C#コードの実行時にパスワードが保存されていない場合は、パスワードダイアログボックスが開き、パスワードを入力するよう求められます。[パスワードを保存] チェックボックスをオンにして、その場で作成して保存することもできます(この例では、パスワード「UserXY」が保存され、後でパスワードマネージャーでこのエントリを見つけることができます)。
利点は、安全に作成したLinqScriptsにパスワードを個別に保存し、Windowsのユーザープロファイルに暗号化できることです(%localappdata%\LINQPad\Passwords
ファイルとして保存されます)。LinqPadはWindows DPAPIを使用してパスワードを保護します。
また、パスワードは一元的に保存されるため、変更する必要がある場合は、メニューで変更でき、作成したすべてのスクリプトにすぐに適用されます。
ノート:
パスワードを保存せずにパスワードダイアログを表示するだけの場合は、次のように2番目のパラメータを使用できます。
var pwd = Util.GetPassword("UserXY", true);
これにより、パスワードダイアログの[パスワードを保存 ]チェックボックスがオフになります(ただし、ユーザーは引き続きチェックできます。とにかく保存することを選択します)。
パスワードをに保存する必要がある場合は、SecureString
このヘルパー関数を使用できます(nb:拡張メソッドを.ToSecureString()
使用するには、Stackoverflowでこのリンクにアクセスしてください-必要に応じてパスワードを元に戻すこともできます)。
System.Security.SecureString GetPasswordSecure(string Name, bool noDefaultSave=true)
{
return Util.GetPassword(Name, noDefaultSave)
.ToSecureString();
}
この方法は、コマンドプロセッサのように機能します。Windowsコンソールから、知っているすべてのコマンドを呼び出すことができます。
例1-dir:
Util.Cmd(@"dir C:\");
これは、ディレクトリの結果を必要とせずに出力し.Dump
ます。変数に格納すると、さらに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();
これにより、に含まれるファイル拡張子「.exe」または「.dll」のすべてのファイルがダンプされC:\windows\system32
ます。/s
スイッチは、すべてのサブディレクトリを再帰的に使用され、/b
裸の出力フォーマットに使用されます。Cmdメソッドの2番目のパラメーターは、Dumpメソッドを使用してフィルターされた結果のみを表示するためにコンソール出力を抑制するように指定されていることに注意してください。
これはdir
、Linqのクエリエンジンの完全な柔軟性を使用できるため、ワイルドカードよりも柔軟性があることがわかります。
例2-テキストエディター:
次のようにメモ帳でファイルを開くことができます。
var filePath=@"C:\HelloWorld.txt";
Util.Cmd(@"%systemroot%\system32\notepad.exe", filePath);
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
すると、進行状況バーを表示できます。次のヘルパークラスを使用できます。
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
違いは、結果ウィンドウに表示されず、メッセージを割り当てることができないことです。
HTMLを出力ウィンドウに表示します。例:
Util.RawHtml (new XElement ("h1", "This is a big heading")).Dump();
このサンプル関数を使用できます
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();
URLのいくつかの種類のために仕事をしません(特に、次のようなポート名合格しなければならない場合:URLの一部として、「1234」)。
コンソールから入力を読み取ります。例:
int age = Util.ReadLine<int> ("Enter your age");
の同義語としてもUtil.ReadLine<string>()
使用できますConsole.ReadLine()
。
しかし、もっとあります!次のスニペットを使用して簡単なJSONパーサーを作成できます。たとえば、オンザフライでJSON文字列を解析してテストする場合などに非常に便利です。テキストエディターを使用して次のスニペットをJSONAnalyzer.linqとして保存し、LinqPadで開きます(これは、参照をその場で簡単に追加するためです)。
<Query Kind="Program">
<Reference><RuntimeDirectory>\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");
}
これを実行して、JSON文字列をクリップボードからコンソールに貼り付けるだけです。このDump
関数を使用して、オブジェクトとしてオブジェクトを適切に表示します。また、問題を修正するために、パーサーのエラーメッセージを画面に表示します。AJAXのデバッグに非常に役立ちます。
スクリプト内の結果ウィンドウをクリアする必要がある場合は、以下を使用します。
Util.ClearResults();
スクリプトの上部で使用するか、またはスクリプトで複数のクエリを実行している場合は、ユーザー入力を待ってから画面を非表示にします(たとえば、前にを付けてUtil.ReadLine
)。
また、興味深いのは、.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
}
このクラスのインスタンスを作成すると、
var obj1 = new test();
obj1.Dump("Test");
それは意志を出力のみHint
、constMember1
、constMember2
、とmyprop
ではなくプロパティxyz
:
メッセージボックスを表示する必要がある場合は、ここでその方法を確認してください。
たとえば、次のコードを使用して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とその名前空間を追加して、これを機能させることを忘れないでください)
(新規:LinqPadバージョンv4.52.1(ベータ)以降で使用可能)
スクリプト内または独自の.NETプログラムまたはWindowsサービス内から別のLINQPadスクリプトを実行できます(LINQPad4-AnyCPUバージョンのを参照することによりLINQPad.exe
)。コマンドラインツール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.exe
またはを介して実行されたかを確認できますUtil.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
LinqToSQLを使用している場合は、(挿入/更新/削除操作のために)変更を永続的にすることができます。データベースコンテキストはLinqPadによって暗黙的に作成されるため、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;
呼び出す前に。
Entity Frameworkを使用している場合は、変更を永続的にすることもできます(挿入/更新/削除操作の場合)。データベースコンテキストはLinqPadによって暗黙的に作成されるため、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、データベースコンテキストは、上部のコンボボックスを使用して、クエリの右のデータベースを選択することで自動的に適用されます。ただし、たとえば、プロジェクトから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.
クエリ内のの各出現を削除することもできますが、はるかに簡単です。追加するだけ
var dc=this; // UserQuery
次のようにスニペットの上部に:
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();
}
コードはすぐに機能します!
LinqPadとOleDbの併用、データテーブルからLinqオブジェクトへの変換、LinqでのSQLクエリ
次のコードスニペットは、OleDbでLinqPadを使用するのに役立ちます。アセンブリからクエリプロパティに追加System.Data.OleDb
し、System.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 4の動的キーワードを使用してのニースの例を
もう1つの例:DBAがSQLクエリを提供し、その結果をLinqPad(もちろんSQLではなくLinq)で分析するとします。その後、次の操作を実行できます。
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クエリはコマンドテキストに「投げ込まれ」、結果は市によってフィルタリングされ、並べ替えられます。
もちろん、これは単純化された例であり、DBAはおそらくより複雑なスクリプトを提供しますが、アイデアを得ています。SELECT句のすべてのフィールドを含むサポート結果クラスを追加するだけで、それを直接使用できます。 。
この方法でストアドプロシージャの結果を取得して、Linqで使用することもできます。ご覧のとおり、この例では、データ型を気にせず、dynamic
それを使用して表現しています。
つまり、これは、データをすばやく分析できるようにするための高速プログラミングに関するものです。さまざまな理由(SQLインジェクション、最初からEFを使用できるためなど)のために、実際のアプリケーションでこれを行うべきではありません。
LinqPadでグラフィックを描画する、パート1
プレス、以下の例を使用するにはF4、[追加System.Windows.dll
、System.Windows.Forms.dll
、WindowsFormsIntegration.dll
、PresentationCore.dll
とPresentationFramework.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でグラフィックを表示する方法を示しています。通常、LinqPadはWpfオブジェクトのみをサポートしています。この例ではSystem.Windows.Forms.Integration.WindowsFormsHost
、を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);
}
これにより、次のグラフィックが作成されます(上記の例では、パネルアイテム「グラフィック」と「画像」が追加されています)。
Northwindデータベースの画像を表示する場合は、次の操作を実行できます。
画像ファイル名を「NorthwindPics.jpg」に変更し、2番目の例の 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テーブルから最初のレコードを読み取り、画像を表示します。
詳細については、次のリンクを確認してください:
WPF LinqPadカスタムビジュアライザーの図形と基本的な描画
注:ここで見た次の例に示すように、PanelManagerがなくても同じことを実現できます。
// 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()
複数回呼び出すことができ、画像を追加します。
LinqPadでグラフィックを描画する、パート2
この投稿に触発された次の例は、C#7を使用してLinqpad 5で簡単な関数プロッタを実装する方法を示しています。
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の機能を使用して、結果パネルにWindowsフォームを表示しています。
追加の参照(プレスを):、、およびこれらのアセンブリからすべての名前空間を追加します。
F4
System.Drawing.dll
System.Windows.Forms.dll
System.Windows.Forms.DataVisualization.dll
追加のヒント/参考文献:
LinqPadを「ポータブルアプリ」として使用する必要がありますか?その方法をここで読んでください。
LinqPadの JoeのWebサイトは、常に優れた情報源です。LinqPad内で、Help -> What's New
新しい関数とメソッドに関するヒントを提供します。LinqPadフォーラムはまた、役に立つヒントが含まれています。
また非常に役立つ:Linq(Pad)デバッグに関するこの記事。
バッチスクリプトでLINQクエリlprun.exe
を実行するために使用します。詳細については、この記事をお読みください。例:
echo Customers.Take(100) > script.txt
lprun -lang=e -cxname=CompanyServer.CustomerDb script.txt
この例では、クエリは単純なLINQ式です。もちろん、-lang=program
プログラムモードをアクティブにするためにを使用して、複雑なクエリを準備することもできます。
拡張メソッドを記述して、LinqPadの左側にある[ My Queries ]タブに保存できます。ツリーの最後のアイテムはMy Extensionsという名前です。それをダブルクリックして、すべてのクエリで使用できる拡張機能を記述できるファイルを開きます。それらをpublic static class MyExtensions
に入れ、Main()
メソッドを使用して拡張機能のテストを含めるだけです。
Dumpはグローバル拡張メソッドであり、SubmitChangesはSystem.Data.Linq.DataContextオブジェクトであるDataContextオブジェクトから取得されます。
LPは、私の知る限り、ダンプと逆アセンブルのみを追加します。Reflectorで開いて、他に使用できるものがないか確認することを強くお勧めします。より興味深いものの1つは、LINQPadによって内部的に使用されるいくつかの利点を持つLINQPad.Util名前空間です。
.Dump()
ソースエディターでをクリックするか、その他の方法で、F12 を押して「反映」します。これがツールに組み込まれました!
以前の回答でStackOverflowテキストの制限に達しましたが、LinqPadにはさらに優れた拡張機能があります。私が言及したいそれらの1つ:
.Dump()
)LinqPadのバージョン5.42ベータ版以降、JavaScript関数を埋め込み、C#コードから直接呼び出すことができます。これには(JSFiddleと比較して)いくつかの制限がありますが、LinqPadで一部のJavaScriptコードをすばやくテストするための良い方法です。
例:
void Main()
{
// JavaScript inside C#
var literal = new LINQPad.Controls.Literal("script",
@"function jsFoo(x) {
alert('jsFoo got parameter: ' + x);
var a = ['x', 'y', 'z']; external.log('Fetched \'' + a.pop() + '\' from Stack');
external.log('message from C#: \'' + x + '\'');
}");
// render & invoke
literal.Dump().HtmlElement.InvokeScript(true, "jsFoo", "testparam");
}
この例ではjsFoo
、1つのパラメーターを持つ関数が準備され、変数に格納されますliteral
。次に、を介してレンダリングされて呼び出され.Dump().HtmlElement.InvokeScript(...)
、パラメータを渡しますtestparam
。
JavaScript関数はexternal.Log(...)
、LinqPadの出力ウィンドウにテキストを出力するために使用します。alert(...)
、ポップアップメッセージを表示するために使用します。
次の拡張クラス/メソッドを追加することで、これを簡略化できます。
public static class ScriptExtension
{
public static object RunJavaScript(this LINQPad.Controls.Literal literal,
string jsFunction, params object[] p)
{
return literal.Dump().HtmlElement.InvokeScript(true, jsFunction, p);
}
public static LINQPad.Controls.Literal CreateJavaScript(string jsFunction)
{
return new LINQPad.Controls.Literal("script", jsFunction);
}
}
次に、前の例を次のように呼び出すことができます。
// JavaScript inside C#
var literal = ScriptExtension.CreateJavaScript(
@"function jsFoo(x) {
alert('jsFoo got parameter: ' + x);
var a = ['x', 'y', 'z']; external.log('Fetched \'' + a.pop() + '\' from Stack');
external.log('message from C#: \'' + x + '\'');
}");
// render & invoke
literal.RunJavaScript("jsFoo", "testparam");
同じ効果がありますが、読みやすくなっています(JavaScriptをもっと実行するつもりなら;-))。
別のオプションとして、Lambda式が好きで、呼び出すたびに関数名を文字列として指定したくない場合は、次のようにできます。
var jsFoo = ScriptExtension.CreateJavaScript(
@"function jsFoo(x) { ... }");
ScriptExtension.RunJavaScript(() => jsFoo, "testparam");
ヘルパー関数を追加した場合
public static object RunJavaScript(Expression<Func<LINQPad.Controls.Literal>> expr,
params object[] p)
{
LINQPad.Controls.Literal exprValue = expr.Compile()();
string jsFunction = ((MemberExpression)expr.Body).Member.Name;
return exprValue.Dump().HtmlElement.InvokeScript(true, jsFunction, p);
}
クラスへScriptExtension
。これによりjsFoo
、JavaScript関数自体と同じ名前の変数名(ここでは)が解決されます(ラムダ式を使用して変数名を解決する方法に注意してください。これはnameof(paramName)
、関数内では使用できません)。
たとえば、実行時間の長いクエリを実行していて、その進行状況を表示したい場合(以下のProgressBarも参照)など、ダンプしたテキストを新しい行に書き込むのではなく上書きする方が便利な場合があります。これはDumpContainer
、を使用して行うことができます。
例1:
void Main()
{
var dc = new DumpContainer("Doing something ... ").Dump("Some Action");
System.Threading.Thread.Sleep(3000); // wait 3 seconds
dc.Content += "Done.";
}
より複雑なオブジェクトでは、dc.UpdateContent(obj);
ではなくを使用する必要がある場合があることに注意してくださいdc.Content=...
。
例2:
void Main()
{
var dc = new DumpContainer().Dump("Some Action");
for (int i = 10; i >= 0; i--)
{
dc.UpdateContent($"Countdown: {i}");
System.Threading.Thread.Sleep(250);
};
dc.UpdateContent("Ready for take off!");
}
進行状況の表示は、次のようにProgressBarを使用して行うこともできます。
例:
void Main()
{
var prog = new Util.ProgressBar("Processing").Dump();
for (int i = 0; i < 101; i++)
{
Thread.Sleep(50); prog.Percent = i;
}
prog.Caption = "Done";
}
これは前のダンプの例と似ていますが、今回はプログレスバーのアニメーションが表示されています。
LinqPadで単体テストを作成できることをご存知ですか?たとえば、xUnitフレームワークを使用できます。LinqPadのNUGETサポート経由で利用できF4ますAdd NUGET....。LinqPad V5またはV6でxUnitを使用する方法を段階的に説明し ます。
もっと見つけたら、この答えを更新します