LINQPad [拡張]メソッド


144

誰かがLINQPad拡張メソッドとメソッドの完全なリストを持っていますか?

.Dump()

SubmitChanges()

1
LINQPadは絶えず変化するツールであるため、この質問をトピック外として締めくくります。この質問に対する確実で具体的な最終回答は、非常に短い期間しかありません。他のツールで同様の質問が広まるのを避けるために、トピックをオフトピックとして閉じることを提案します。
Lasse V. Karlsen

5
投票について私が言うことは何もないが、私は確かにこの答えを閉じることに同意しない。最初に、質問の賛成票を見て、次に最初の2つのコメントの賛成票を見てください。第二に、ジョセフからの回答が最終的な回答より少なくなることはありますか。彼はそのことを書いた。最後に、他のアプリケーションはドキュメントにStackoverflowを使用します。私は常に開発にLinqPadを使用し、C#とLinqクエリのプロトタイピング、SQLの実行、Quick DBAタスクの実行、その他多数のことを行っています。だから、少なくとも私にとっては、答えは間違いなく話題です。
EoRaptor013 2018年

3
終わりに:C#の古い質問に複数の回答を追加して、質問が回答されてから言語に導入されたより現代的な手法を提供します。IMOは、このサイトが表すナレッジベースがテクノロジーの進展に伴って変更および更新されることを期待する必要があります。将来の更新が特定の時点で与えられた回答を妥協または無効にする可能性があるトピックの範囲は非常に広いです。これが発生する可能性があるすべての質問を閉じた場合、スタックオーバーフローははるかに貧弱なリソースになります。ここでは、完全なリストが部分的なリストになり、リストがないよりも優れています!
ボブサマーズ

回答:


255

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にはいくつかの便利な静的メソッドがあります。これらはオートコンプリートで文書化され、次のものが含まれます。

  • Cmd-シェルコマンドまたは外部プログラムを実行します
  • CreateXhtmlWriter -LINQPadのDump()フォーマッターを使用するテキストライターを作成します
  • SqlOutputWriter -SQL出力ウィンドウに書き込むテキストライターを返します
  • GetMyQueriesGetSamples-保存されたクエリ/サンプルを表すオブジェクトのコレクションを返します(たとえば、編集|すべて検索を使用して検索を実行します)
  • ハイライト -オブジェクトをラップして、ダンプしたときに黄色でハイライト表示します
  • Horizo​​ntalRun-一連のオブジェクトを同じ行にダンプできます

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)では、新しいクラスとメソッドが導入されました

  • DumpContainer(クラス)
  • OnDemand(拡張メソッド)
  • Util.ProgressBar(クラス)

さらに、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);
}

33
著者自身からの回答に勝るものはありません!
ジョン

1
ジョー、私は実際にいくつかのグラフィックス作品もプロトタイプ化したかったので、ビットマップをダンプしたかった。この種の作業でShowメソッドを使用すると、グラフィックスや画像などの作業を行うのに最適です。将来、他の種類の画像をきちんと視覚化できる可能性があります。
Bent Rasmussen

...実際には、出力パネルにグラフィックを送信できる限り、残りの部分の拡張機能を自分で作成できます。
Bent Rasmussen

3
4.26ベータでは、Util.RawHtmlを呼び出して、XHTMLを出力ストリームに挿入できます。www.linqpad.net/beta.aspxにアクセスします(またはRTMを数日待ちます)。
Joe Albahari、2009

1
Alex-1つ以上のものをラインに入れるには、Util.Horizo​​ntalRunを使用します
Joe Albahari 2013

131

よく知られているに加えて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

第一の例のプリントのみ変数acし、皮革bd第二の例では、反対の(それは指定することに注意してください使用可能なパラメータのわずか2)を行います。変数yおよびzは、トップレベルにないため、個別に非表示にすることはできません。

次のパラメーターを使用できます(すべてオプションです)。

  • description [string]-ダンプするオブジェクトの説明を提供します
  • depth [int?]-オブジェクトを再帰的に検査する深さを制限します
  • toDataGrid [bool]-trueの場合、出力はリッチテキストではなくデータグリッドとしてフォーマットされます
  • exclude[文字列] -あなたは変数のカンマ区切りのリストを提供する場合、彼らは(例では「C」を:出力から除外されるbd示され、aそしてc隠されています)
  • exclude[string] with "+"プレフィックス-プレフィックスはexcludeパラメータのロジックを反転します。つまり、変数のコンマ区切りリストを指定すると、指定されたものを除くすべてが非表示になります(例では "+ b、d":bd表示され、他はすべて非表示になっています)。
  • 含まれるプロパティと除外されるプロパティを変数に格納します(LinqPad V5.09.04以降の新機能):
    var x=Util.ToExpando(obj, "a, c", "b, d"); x.Dump();
    最初の文字列には含めるプロパティのリストが含まれ、2番目の文字列には除外するリストが含まれます
  • クリックで展開:の.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


Util.WriteCsv

新規:LinqPadバージョンv4.45.05(ベータ)以降で使用可能)

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

これにより、テーブルの内容がCustomersCSVファイルに書き込まれます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"。その他のコードサンプルについては、このリンクを確認してください。


Util.GetPassword

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();
    }


Util.Cmd

この方法は、コマンドプロセッサのように機能します。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);

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();URLのいくつかの種類のために仕事をしません(特に、次のようなポート名合格しなければならない場合:URLの一部として、「1234」)。


Util.ReadLine

コンソールから入力を読み取ります。例:

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

の同義語としてもUtil.ReadLine<string>()使用できますConsole.ReadLine()

しかし、もっとあります!次のスニペットを使用して簡単なJSONパーサーを作成できます。たとえば、オンザフライでJSON文字列を解析してテストする場合などに非常に便利です。テキストエディターを使用して次のスニペットを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");
}

これを実行して、JSON文字列をクリップボードからコンソールに貼り付けるだけです。このDump関数を使用して、オブジェクトとしてオブジェクトを適切に表示します。また、問題を修正するために、パーサーのエラーメッセージを画面に表示します。AJAXのデバッグに非常に役立ちます。

JSON


Util.ClearResults

スクリプト内の結果ウィンドウをクリアする必要がある場合は、以下を使用します。

Util.ClearResults();

スクリプトの上部で使用するか、またはスクリプトで複数のクエリを実行している場合は、ユーザー入力を待ってから画面を非表示にします(たとえば、前にを付けて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
}

このクラスのインスタンスを作成すると、

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

それは意志を出力のみHintconstMember1constMember2、とmypropではなくプロパティxyz

Linqpadダンプ


LinqPadでのメッセージボックスまたは入力ボックスの表示

メッセージボックスを表示する必要がある場合は、ここでその方法を確認してください。

たとえば、次のコードを使用して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(ベータ)以降で使用可能)

スクリプト内または独自の.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

SubmitChanges()-Linq To SQL

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;

呼び出す前に。


SaveChanges()-エンティティフレームワーク

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;

呼び出す前に。


this-データベースコンテキスト

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(); 
}   

コードはすぐに機能します!


this.Connection

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を使用できるためなど)のために、実際のアプリケーションでこれを行うべきではありません。


PanelManager

LinqPadでグラフィックを描画する、パート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でグラフィックを表示する方法を示しています。通常、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);
}

これにより、次のグラフィックが作成されます(上記の例では、パネルアイテム「グラフィック」と「画像」が追加されています)。

Showing_Graphic_in_LinqPad

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()複数回呼び出すことができ、画像を追加します。


Windowsフォーム

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.dllSystem.Windows.Forms.dllSystem.Windows.Forms.DataVisualization.dll


追加のヒント/参考文献:

  • Visual Studioで LinqPadを使用したいですか?方法は次とおりです

  • 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()メソッドを使用して拡張機能のテストを含めるだけです。


2
Util.ReadLine <string>( "jsonを入力してください")に関するヒントが大好きです。以前は、それをファイルにコピーしてからそこから読み取っていました...私はこのヒントが大好きです。ありがとう!
loneshark99

2

Dumpはグローバル拡張メソッドであり、SubmitChangesはSystem.Data.Linq.DataContextオブジェクトであるDataContextオブジェクトから取得されます。

LPは、私の知る限り、ダンプと逆アセンブルのみを追加します。Reflectorで開いて、他に使用できるものがないか確認することを強くお勧めします。より興味深いものの1つは、LINQPadによって内部的に使用されるいくつかの利点を持つLINQPad.Util名前空間です。


注:新しいバージョンのLinqPadの場合:.Dump()ソースエディターでをクリックするか、その他の方法で、F12 を押して「反映」します。これがツールに組み込まれました!
マット

1

以前の回答StackOverflowテキストの制限に達しましたが、LinqPadにはさらに優れた拡張機能があります。私が言及したいそれらの1つ:


JavaScript関数(を使用.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)、関数内では使用できません)。


.Dump()-メッセージをインラインで更新する

たとえば、実行時間の長いクエリを実行していて、その進行状況を表示したい場合(以下の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.";
}

DumpContainerAnimation

より複雑なオブジェクトでは、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!");
}

Util.ProgressBar

進行状況の表示は、次のように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で単体テストを作成できることをご存知ですか?たとえば、xUnitフレームワークを使用できます。LinqPadのNUGETサポート経由で利用できF4ますAdd NUGET....LinqPad V5またはV6でxUnit使用する方法を段階的に説明し ます。


もっと見つけたら、この答えを更新します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.