153

次のようなLINQPad拡張メソッドとメソッドの完全なリストを持っている人はいますか

.Dump()

SubmitChanges()
4

4 に答える 4

269

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 (クラス)
  • オンデマンド(延長方式)
  • 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);
}
于 2010-08-25T01:04:07.380 に答える
143

LinqPad 拡張メソッド - パート 1/2

パート 2 に進む


よく知られている のほかに、myQuery.Dump("Query result:")言及すべきもう 1 つの機能はUtilクラスです。このクラスには、非常に便利なメソッドが多数含まれています (一部は前述しましたが、他にも多数あります)。

また興味深いのは、動作の仕方を変更Dump()できることです。

最後に、LinqPad の内部接続オブジェクトにアクセスする方法と同様に、変更を永続的にする方法( LINQ クエリの挿入、更新、削除) を紹介します。SubmitChanges()SaveChanges()

まとめとして、LinqPad 内で単純な2D グラフィックを作成する方法(線、ビットマップ、または関数の描画) を紹介します。

したがって、組み込みの LinqPad 機能のコレクションを次に示します(このツールでの私自身の経験から)。


。ごみ()

(パラメータはLinqPad v5.03.08以降で利用可能)

拡張メソッドは、.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

1 番目のでは変数aandのみを表示しcて and を非表示bにしd2 番目の例ではその逆を行います (使用可能なパラメーターのうち 2 つだけを指定していることに注意してください)。変数yzは最上位にないため、個別に非表示にすることはできません。

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

  • description[文字列] - ダンプするオブジェクトの説明を提供します
  • depth[int?] - オブジェクトが再帰的に検査される深さを制限します
  • toDataGrid[bool] - true の場合、出力は RichText ではなくデータグリッドとしてフォーマットされます
  • exclude[文字列] - 変数のコンマ区切りリストを指定すると、それらは出力から除外されます (例では、「a,c」: banddが表示され、非表示にaなってcいます) 。
  • exclude[string] with "+" prefix - プレフィックスは、除外パラメーターのロジックを反転させます。つまり、コンマ区切りの変数リストを指定すると、指定されたものを除くすべてが非表示になります (例では、「+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関心がある場合にのみ詳細を表示する場合などです。

Dump に関するより高度なトピックは、ここそこにあります。


Util.WriteCsv

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

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

これにより、テーブルの内容がCustomersCSV ファイルに書き込まれますc:\temp\customers.csvUtil.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このヘルパー関数を使用できます (注意: 拡張メソッドを使用するには、Stackoverflow のこのリンクに.ToSecureString()従ってください。必要に応じて元に戻すこともできます)。
    System.Security.SecureString GetPasswordSecure(string Name, bool noDefaultSave=true)
    {
       return Util.GetPassword(Name, noDefaultSave).ToSecureString();
    }


Util.Cmd

このメソッドは、コマンド プロセッサのように機能します。知っているすべてのコマンドを Windows コンソールから呼び出すことができます。

例 1 - ディレクトリ:

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 メソッドを使用してフィルター処理された結果のみを表示するために、コンソール出力を抑制するように指定されていることに注意してください。

dirLinq のクエリ エンジンの完全な柔軟性を使用できるため、ワイルドカードよりも柔軟であることがわかります。

例 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");

Hint次に、 、constMember1constMember2、およびのみを出力しますmypropが、プロパティは出力しません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 (ベータ)以降で利用可能)

スクリプト内から、または独自の .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.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.クエリ内の各出現箇所を削除することもできますが、その方がはるかに簡単です。次のようにスニペットの先頭に追加するだけです。

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

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


this.接続

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

Linq に変換することもできますmyDS。次の質問への回答は、その方法を示しています

もう 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それを表現するために使用しています。
つまり、これはデータをすばやく分析できるようにするラピッド プログラミングに関するものです。さまざまな理由から、実際のアプリケーションではこれを行うべきではありません (最初から EF を使用できるため、SQL インジェクションなど)。


PanelManager

LinqPad でグラフィックを描く、パート 1

以下の例を使用するには、 、 、 、および を押してLinqPadプログラムに追加し、名前空間 も追加しF4ます。System.Windows.dllSystem.Windows.Forms.dllWindowsFormsIntegration.dllPresentationCore.dllPresentationFramework.dllSystem.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");

2 番目のは、PanelManager を使用して LinqPad にグラフィックを表示する方法を示しています。通常、LinqPad は Wpf オブジェクトのみをサポートします。この例では、 を使用可能System.Windows.Forms.Integration.WindowsFormsHostにするために使用しPictureBoxます ( this に触発されました):

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

これにより、次のグラフィックが作成されます (上記の例では、パネル項目「Graphic」と「Picture」が追加されています)。

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 で関数プロッターを実装する方法を示しています。

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するために使用します。詳細については、この記事をお読みください。例: この例では、クエリは単純な LINQ 式です。もちろん、プログラムモードを有効にして複雑なクエリを準備することもできます。
    echo Customers.Take(100) > script.txt
    lprun -lang=e -cxname=CompanyServer.CustomerDb script.txt
    -lang=program

  • LinqPad の左側にある [ My Queries ] タブに拡張メソッドを記述して保存できます。ツリーの最後の項目はMy Extensionsという名前です。それをダブルクリックしてファイルを開き、すべてのクエリで使用できる拡張機能を記述できます。それらを public static classMyExtensionsに入れ、メソッドを使用Main()して拡張機能のテストを含めます。


続きはこちら…

于 2012-08-17T12:41:23.230 に答える
2

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

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

于 2010-08-25T01:04:37.763 に答える