Metode [ekstensi] LINQPad

144

Adakah yang punya daftar lengkap metode dan metode ekstensi LINQPad, seperti

.Dump()

SubmitChanges()
Bent Rasmussen
sumber
1
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena LINQPad adalah alat yang selalu berubah, memiliki jawaban yang solid dan konkret dan final pada pertanyaan ini akan memiliki umur yang sangat singkat. Saya mengusulkan untuk menutupnya sebagai di luar topik untuk menghindari mempromosikan pertanyaan serupa untuk alat lain.
Lasse V. Karlsen
5
Bukannya saya memiliki sesuatu untuk dikatakan tentang pemungutan suara, tetapi saya tentu tidak setuju dengan penutupan jawaban ini. Pertama, lihat saja upvotes untuk pertanyaan, lalu lihat upvotes untuk dua komentar pertama. Kedua, bagaimana jawaban dari Joseph kurang dari jawaban akhir; dia menulisnya. Akhirnya, aplikasi lain menggunakan Stackoverflow untuk dokumentasi mereka. Saya menggunakan LinqPad untuk pengembangan sepanjang waktu, membuat prototipe pertanyaan C # dan Linq, menjalankan SQL, dan melakukan tugas DBA Cepat, dan banyak hal lainnya. Jadi, setidaknya bagi saya, jawaban pasti pada topik.
EoRaptor013
3
Penutupan ulang: Saya telah menambahkan lebih dari satu jawaban untuk pertanyaan lama pada C # untuk memberikan teknik yang lebih modern yang telah diperkenalkan ke bahasa sejak pertanyaan itu dijawab. IMO kita harus berharap bahwa basis pengetahuan yang diwakili oleh situs ini dimodifikasi dan diperbarui seiring dengan kemajuan teknologi. Rentang topik di mana pembaruan di masa mendatang dapat membahayakan atau membatalkan jawaban yang diberikan pada titik waktu tertentu cukup luas: jika kita menutup semua pertanyaan di mana ini mungkin terjadi, Stack Overflow akan menjadi sumber yang jauh lebih buruk! Di sini, daftar lengkap dapat menjadi daftar sebagian yang lebih baik daripada tidak ada daftar!
Bob Sammers

Jawaban:

255

LINQPad mendefinisikan dua metode ekstensi (dalam LINQPad.Extensions), yaitu Dump()dan Disassemble(). Dump()menulis ke jendela output menggunakan formatter output LINQPad dan kelebihan beban untuk membiarkan Anda menentukan judul:

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

Anda juga dapat menentukan kedalaman rekursi maksimum untuk menimpa default 5 level:

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 () membongkar metode apa pun untuk IL, mengembalikan output dalam sebuah string:

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

Selain kedua metode ekstensi tersebut, ada beberapa metode statis yang berguna di LINQPad.Util. Ini didokumentasikan dalam pelengkapan otomatis, dan termasuk:

  • Cmd - mengeksekusi perintah shell atau program eksternal
  • CreateXhtmlWriter - membuat penulis teks yang menggunakan pemformat Dump () LINQPad
  • SqlOutputWriter - mengembalikan penulis teks yang menulis ke jendela output SQL
  • GetMyQueries , GetSamples - mengembalikan koleksi objek yang mewakili kueri / sampel tersimpan Anda (misalnya, jalankan pencarian menggunakan Edit | Cari Semua)
  • Sorot - membungkus suatu objek sehingga akan menyorot berwarna kuning saat Dibuang
  • HorizontalRun - memungkinkan Anda membuang serangkaian objek pada baris yang sama

LINQPad juga menyediakan kelas HyperLinq. Ini memiliki dua tujuan: yang pertama adalah untuk menampilkan hyperlink biasa:

new Hyperlinq ("www.linqpad.net").Dump();
new Hyperlinq ("www.linqpad.net", "Web site").Dump();
new Hyperlinq ("mailto:[email protected]", "Email").Dump();

Anda dapat menggabungkan ini dengan Util.HorizontalRun:

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

Hasil:

Lihatlah situs ini untuk mendapatkan jawaban atas pertanyaan pemrograman.

Tujuan kedua HyperLinq adalah untuk secara dinamis membangun kueri:

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

Anda juga dapat menulis metode ekstensi Anda sendiri di LINQPad. Buka 'Kueri Saya' dan klik kueri yang disebut 'Ekstensi Saya'. Jenis / metode apa pun yang didefinisikan di sini dapat diakses oleh semua pertanyaan:

void Main()
{
  "hello".Pascal().Dump();  
}

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

Dalam 4,46 (0,02) kelas dan metode baru telah diperkenalkan :

  • DumpContainer (kelas)
  • OnDemand (metode ekstensi)
  • Util.ProgressBar (kelas)

Selain itu, kelas Hyperlinq sekarang mendukung delegasi Tindakan yang akan dipanggil ketika Anda mengklik tautan, yang memungkinkan Anda untuk bereaksi dalam kode dan bukan hanya tautan ke halaman web eksternal.

DumpContainer adalah kelas yang menambahkan blok ke jendela output yang isinya dapat diganti.

CATATAN! Ingatlah untuk .Dump()yang DumpContainersendiri di tempat yang tepat.

Menggunakan:

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

OnDemandadalah metode ekstensi yang tidak akan menampilkan konten parameternya ke jendela output, melainkan menambahkan tautan yang dapat diklik, yang bila diklik akan mengganti tautan dengan .Dump()konten ed parameter. Ini bagus untuk struktur data yang kadang dibutuhkan yang mahal atau menghabiskan banyak ruang.

CATATAN! Ingatlah untuk .Dump()hasil panggilan OnDemanddi tempat yang tepat.

Untuk menggunakannya:

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

Util.ProgressBar adalah kelas yang dapat menampilkan progressbar grafis di dalam jendela output, yang dapat diubah saat kode bergerak.

CATATAN! Ingatlah untuk .Dump()objek Util.ProgressBar di tempat yang tepat.

Untuk menggunakannya:

var pb = new Util.ProgressBar("Analyzing data");
pb.Dump();
for (int index = 0; index <= 100; index++)
{
    pb.Percent = index;
    Thread.Sleep(100);
}
Joe Albahari
sumber
33
Tidak ada yang lebih baik daripada jawaban dari penulis sendiri!
John
1
Joe, saya sebenarnya ingin membuat prototipe beberapa karya grafis juga dan kemudian ingin membuang bitmap; akan sangat bagus dengan metode Show untuk jenis pekerjaan ini di mana Anda ingin visualisasi, bekerja pada Grafik, Gambar, dll. Mungkin memberikan visualisasi yang rapi untuk beberapa jenis lainnya.
Bent Rasmussen
... Sebenarnya, selama Anda dapat mengirim gambar ke panel output, kami dapat membangun ekstensi untuk diri kami sendiri.
Bent Rasmussen
3
Beta 4,26 memungkinkan Anda menyuntikkan XHTML ke aliran output, dengan memanggil Util.RawHtml. Kunjungi www.linqpad.net/beta.aspx (atau tunggu beberapa hari untuk RTM).
Joe Albahari
1
Alex - untuk mendapatkan> 1 hal dalam satu baris, gunakan Util.HorizontalRun
Joe Albahari
131

Selain terkenal myQuery.Dump("Query result:"), fitur lain untuk disebutkan adalah Utilkelas: Ini berisi banyak metode yang sangat berguna (beberapa dari mereka saya sebutkan, tetapi ada banyak lagi).

Yang juga menarik adalah Anda bisa memodifikasi cara Dump()kerjanya .

Akhirnya saya akan menunjukkan kepada Anda bagaimana Anda dapat membuat perubahan permanen (yaitu menyisipkan, memperbarui, menghapus kueri LINQ) menggunakan SubmitChanges()atau SaveChanges()juga bagaimana Anda dapat mengakses objek koneksi internal LinqPad.

Dan untuk mengatasinya, saya akan menunjukkan kepada Anda bagaimana Anda dapat membuat grafik 2d sederhana di dalam LinqPad (menggambar garis, bitmap atau fungsi ).

Jadi, inilah koleksi fitur LinqPad bawaan (dari pengalaman saya sendiri dengan alat ini):


.Membuang()

(parameter tersedia di LinqPad v5.03.08 dan di atas)

Semua pengguna LinqPad tahu dan menyukai .Dump()metode ekstensi, yang mengkonsumsi dan mencetak (hampir) semuanya.

Tapi tahukah Anda ada beberapa parameter yang tersedia? Lihatlah potongan kode ini:

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

Contoh 1 hanya mencetak variabel adan cmenyembunyikan bdan d, contoh 2 melakukan sebaliknya (perhatikan bahwa hanya menetapkan 2 parameter yang tersedia). Variabel ydan ztidak dapat disembunyikan secara individual, karena mereka tidak berada di tingkat atas.

Parameter berikut tersedia ( semua adalah opsional ):

  • description [string] - memberikan deskripsi untuk objek yang akan dibuang
  • depth [int?] - membatasi seberapa dalam objek diperiksa secara rekursif
  • toDataGrid [bool] - jika benar, output diformat sebagai datagrid daripada sebagai RichText
  • exclude[string] - jika Anda memberikan daftar variabel yang dipisahkan koma, mereka akan dikeluarkan dari output (dalam contoh "a, c": bdan dditampilkan, adan cdisembunyikan)
  • exclude[string] dengan awalan "+" - awalan membalikkan logika dari parameter kecualikan. Ini berarti, jika Anda memberikan daftar variabel yang dipisahkan koma, semua kecuali yang ditentukan disembunyikan (dalam contoh "+ b, d": bdan dditampilkan, semua lainnya disembunyikan)
  • toko menyertakan dan mengecualikan properti dalam variabel (baru sejak LinqPad V5.09.04):
    var x=Util.ToExpando(obj, "a, c", "b, d"); x.Dump();
    String pertama berisi daftar properti yang akan disertakan, string kedua daftar untuk dikecualikan
  • Perluas saat klik: Jika Anda menggunakan .OnDemand("click me").Dump();alih-alih .Dump(), itu akan menampilkan tautan yang bisa Anda klik untuk memperluas. Berguna jika Anda ingin memeriksa nilai-nilai, misalnya Util.OnDemand("Customer-ID: " + customerObject.ID.ToString(), ()=>customerObject, false).Dump();untuk selalu menunjukkan ID per default tetapi mengungkapkan rincian customerObjecthanya jika Anda tertarik.

Topik lebih lanjut tentang Dump dapat ditemukan di sana - sini .


Lingkungan Hidup

Ini bukan ekstensi LinqPad, melainkan kelas .NET, tetapi karena ini berguna, saya akan tetap menyebutkannya. Anda bisa mendapatkan banyak informasi berguna yang dapat Anda gunakan dalam skrip Anda seperti:

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

NB Untuk mendapatkan Domain\UserNamesaya akan menggunakan System.Security.Principal.WindowsIdentity.GetCurrent().Name
daripada Environment.UserDomainName+@"\"+Environment.UserName.


Util.WriteCsv

( baru: tersedia sejak LinqPad versi v4.45.05 (beta) )

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

Ini akan menulis konten tabel Customerske file CSV c:\temp\customers.csv. Anda juga dapat menemukan contoh yang bagus bagaimana menggunakan Util.WriteCsvdan kemudian menampilkan data CSV di jendela hasil Linqpad di sini .

Petunjuk:

  • Untuk mendapatkan / membuat file CSV yang ada di direktori yang sama dengan kueri, Anda dapat menggunakan:
    var csvFile=Util.CurrentQueryPath.Replace(".linq", ".csv");

  • Jika tabelnya besar, gunakan ObjectTrackingEnabled = false;sebelum Anda menulis CSV untuk menghindari caching di memori.

  • Jika Anda ingin menampilkan tabel dalam format XML daripada sebagai file yang dipisahkan koma, Anda dapat melakukannya seperti:

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

    Contoh ini mengembalikan semua elemen yang memiliki atribut attr1yang berisi nilai "a"dari file XML yang memiliki nama yang sama dengan kueri dan terkandung di jalur yang sama. Lihat tautan ini untuk contoh kode lebih banyak.


Util.GetPassword

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

Ini akan mengambil kata sandi dari pengelola kata sandi bawaan LinqPad. Untuk membuat & mengubah password, membuka "manajer Password" item menu di menu "File" dari LINQPad. Jika tidak ada kata sandi yang disimpan ketika Anda menjalankan kode C #, dialog kata sandi akan terbuka meminta Anda untuk kata sandi dan Anda memiliki pilihan untuk membuat dan menyimpannya dengan cepat dengan mencentang kotak centang simpan kata sandi (dalam contoh, kata sandi untuk "UserXY" akan disimpan, dan nanti Anda dapat menemukan entri ini di pengelola Kata sandi ).

Keuntungannya adalah Anda dapat menyimpan kata sandi di dalam LinqScripts yang Anda buat dengan aman, secara terpisah dan dienkripsi dalam profil pengguna Windows (disimpan dalam %localappdata%\LINQPad\Passwordsbentuk file). LinqPad menggunakan Windows DPAPI untuk melindungi kata sandi.

Selain itu, kata sandi disimpan secara terpusat, jadi jika Anda perlu mengubahnya, Anda dapat melakukannya di menu dan langsung berlaku untuk semua skrip yang Anda buat.

Catatan:

  • Jika Anda tidak ingin menyimpan kata sandi dan hanya memunculkan dialog kata sandi, Anda dapat menggunakan parameter ke-2 sebagai berikut:
    var pwd = Util.GetPassword("UserXY", true);
    Ini akan menghapus centang pada kotak centang simpan kata sandi dalam dialog kata sandi (namun, pengguna masih dapat memeriksanya dan tetap memilih untuk menyimpan).

  • Jika Anda memerlukan kata sandi untuk disimpan dalam SecureString, Anda dapat menggunakan fungsi pembantu ini (nb: untuk .ToSecureString()menggunakan metode ekstensi , harap ikuti tautan ini di Stackoverflow - ini juga memungkinkan Anda untuk mengubahnya kembali jika diperlukan):
    System.Security.SecureString GetPasswordSecure(string Name, bool noDefaultSave=true)
    {
      return Util.GetPassword(Name, noDefaultSave).ToSecureString();
    }


Util.Cmd

Metode ini bekerja seperti pemroses perintah. Anda dapat memanggil semua perintah yang Anda tahu dari konsol Windows.

Contoh 1 - dir:

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

Ini akan menampilkan hasil direktori tanpa perlu .Dump. Menyimpannya dalam sebuah variabel memiliki keuntungan yang bisa Anda gunakan lebih lanjut dengan query Linq. Sebagai contoh:

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

Ini akan membuang semua file dengan ekstensi file ".exe" atau ".dll" yang ada di C:\windows\system32. The /sswitch digunakan untuk recurse semua subdirektori dan /bdigunakan untuk format output telanjang. Perhatikan bahwa parameter kedua dari metode Cmd ditentukan untuk menekan output konsol agar hanya menampilkan hasil yang disaring menggunakan metode Dump.

Anda dapat melihat bahwa ini lebih fleksibel daripada wildcard yang Anda miliki dirkarena Anda dapat menggunakan fleksibilitas penuh dari mesin query Linq.

Contoh 2 - editor teks:

Anda dapat membuka file di Notepad seperti ini:

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

Util. Gambar

Menampilkan gambar dari URL. Contoh:

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

Menggunakan Util.ProgressBarmemungkinkan Anda untuk menampilkan bilah kemajuan. Anda dapat menggunakan kelas pembantu berikut:

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

Cukup gunakan sebagai contoh berikut menunjukkan:

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

Atau Anda dapat menggunakan Util.Progressuntuk memperbarui bilah kemajuan terintegrasi LinqPads, misalnya:

Util.Progress = 25; // 25 percent complete

Perbedaannya adalah bahwa itu tidak akan ditampilkan di jendela hasil, dan Anda tidak dapat menetapkan pesan untuk itu.


Util.RawHtml

Menampilkan HTML di jendela output. Contoh:

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

Hyperlinq, Util.HorizontalRun

Anda dapat menggunakan fungsi contoh ini

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

untuk menampilkan hyperlink di jendela hasil - atau tindakan apa pun seperti membuka editor favorit Anda. Pemakaian:

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

Perhatikan bahwa fungsi ini selalu berfungsi, sementara new Hyperlinq ("http://myURL", "Web site").Dump();tidak berfungsi untuk beberapa jenis URL (terutama, jika Anda harus memasukkan nama port seperti ": 1234" sebagai bagian dari URL).


Util.ReadLine

Membaca input dari konsol. Contoh:

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

Sebagai sinonim untuk Util.ReadLine<string>(), Anda dapat menggunakan Console.ReadLine()juga.

Tapi masih ada lagi! Anda dapat membuat parser JSON sederhana dengan cuplikan berikut - cukup berguna, misalnya jika Anda ingin mengurai dan menguji string JSON dengan cepat. Simpan cuplikan berikut sebagai JSONAnalyzer.linq menggunakan editor teks dan kemudian buka di LinqPad (ini untuk menambahkan referensi dengan mudah dengan cepat):

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

Sekarang Anda dapat menjalankannya dan cukup menempelkan string JSON dari clipboard ke konsol - itu akan menggunakan Dumpfungsi untuk menampilkannya sebagai objek dengan baik - dan Anda juga mendapatkan pesan kesalahan parser di layar untuk memperbaiki masalah. Sangat berguna untuk debugging AJAX.

JSON


Util.ClearHasil

Jika Anda perlu menghapus jendela hasil di dalam skrip Anda, gunakan:

Util.ClearResults();

Baik menggunakannya di bagian atas skrip Anda, atau - jika Anda menjalankan beberapa kueri dalam skrip - Anda harus menunggu input pengguna sebelum mengosongkan layar (misalnya dengan mendahului dengan Util.ReadLine).


Kustom .Dump () - ICustomMemberProvider

Yang juga menarik adalah, Anda dapat mengubah output .Dump()metode. Cukup implementasikan antarmuka ICustomMemberProvider, mis

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
}

Jika Anda membuat turunan dari kelas ini, seperti

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

maka itu akan menampilkan hanya Hint, constMember1, constMember2, dan myprop, tetapi tidak properti xyz:

Dump linqpad


Menampilkan MessageBox atau InputBox di LinqPad

Jika Anda perlu menampilkan kotak pesan, lihat di sini cara melakukannya.

Misalnya, Anda dapat menampilkan InputBox dengan menggunakan kode berikut

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
    }
}

(jangan lupa untuk menekan F4 dan menambahkan Microsoft.VisualBasic.dll dan ruang namanya untuk membuat ini berfungsi)


Util.Jalankan

( baru: tersedia sejak LinqPad versi v4.52.1 (beta) )

Memungkinkan Anda menjalankan skrip LINQPad lain dari dalam skrip Anda atau dalam program .NET atau layanan Windows Anda sendiri (dengan merujuk versi LINQPad4-AnyCPU LINQPad.exe). Itu mengeksekusi skrip seperti halnya alat baris perintah lprun.exeakan melakukannya.

Contoh:

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

Contoh ini menjalankan skrip foo.linq, yang berisi kode sampel berikut:

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", "[email protected]", "[email protected]", "Test Subject" };
    #endif
    args.Dump("Args");
}

Ini memungkinkan Anda untuk memeriksa apakah skrip dijalankan dari dalam LinqPad GUI atau melalui lprun.exeatau dengan Util.Run.

Catatan: Variasi doa berikut mungkin bermanfaat:

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

Jika Anda menggunakan LinqToSQL , Anda mungkin ingin membuat perubahan permanen (untuk operasi insert / update / delete ). Karena konteks basis data secara implisit dibuat oleh LinqPad, Anda perlu menelepon SubmitChanges()setelah setiap perubahan seperti yang ditunjukkan di bawah ini.

Contoh untuk (LinqPad-) database Northwind :

Memasukkan

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

Memperbarui

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

Menghapus

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

Catatan: Untuk mendapatkan ID yang valid untuk contoh sebelumnya, Anda dapat menggunakan:

var cID = (from c in Categories 
            where c.CategoryName.Contains("Seafood") 
            select c).FirstOrDefault().CategoryID;

var pID = Products.Count()+1;

sebelum Anda memohon mereka.


SaveChanges () - Kerangka Entitas

Jika Anda menggunakan Entity Framework , Anda mungkin ingin membuat perubahan juga (untuk operasi insert / update / delete ). Karena konteks basis data secara implisit dibuat oleh LinqPad, Anda perlu menelepon SaveChanges()setelah setiap perubahan seperti yang ditunjukkan di bawah ini.

Contoh-contoh pada dasarnya sama dengan sebelumnya untuk LinqToSQL , tetapi Anda harus menggunakan SaveChanges()sebagai gantinya, dan untuk memasukkan dan menghapus metode telah berubah juga.

Memasukkan

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

Memperbarui

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

Menghapus

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

Catatan: Untuk mendapatkan ID yang valid untuk contoh sebelumnya, Anda dapat menggunakan:

var cID = (from c in Categories 
            where c.CategoryName.Contains("Seafood") 
            select c).FirstOrDefault().CategoryID;

var pID = Products.Count()+1;

sebelum Anda memohon mereka.


ini - konteks basis data

Di LinqPad , konteks database diterapkan secara otomatis dengan menggunakan kotak kombo di bagian atas dan memilih database yang tepat untuk permintaan Anda. Tapi kadang-kadang, berguna untuk referensi secara eksplisit, misalnya jika Anda menyalin beberapa kode dari proyek Anda dari Visual Studio , dan tempel ke LinqPad.

Cuplikan kode Anda yang diambil dari proyek Visual Studio sangat mungkin terlihat seperti ini:

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

Sekarang apa yang harus dilakukan dc? Tentu saja, Anda dapat menghapus setiap kemunculan dc.dalam kueri Anda, tetapi itu jauh lebih mudah. Cukup tambahkan

var dc=this; // UserQuery

ke bagian atas cuplikan Anda seperti ini:

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

dan kode akan bekerja secara instan!


ini. Koneksi

Menggunakan LinqPad dengan OleDb, mengonversi objek data menjadi Linq, SQL kueri di Linq

Cuplikan kode berikut membantu Anda menggunakan LinqPad dengan OleDb. Tambahkan System.Data.OleDbdari System.Datarakitan ke properti kueri, lalu rekatkan kode berikut ke 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();

Sekarang tambahkan koneksi SqlServer ke LinqPad dan tambahkan database Northwind untuk menjalankan contoh ini.

NB: Jika Anda hanya ingin mendapatkan database dan server dari koneksi yang dipilih saat ini, Anda dapat menggunakan potongan kode ini:

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

Anda bahkan dapat mengonversi myDSke dalam Linq, jawaban untuk pertanyaan berikut menunjukkan bagaimana melakukannya: Contoh-contoh yang bagus dari menggunakan .NET 4 kata kunci dinamis dengan Linq

Satu lagi contoh: Misalkan DBA Anda memberi Anda permintaan SQL dan Anda ingin menganalisis hasilnya di LinqPad - tentu saja dalam Linq, bukan dalam SQL. Maka Anda dapat melakukan hal berikut:

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

Dalam contoh ini, kueri SELECT DBA hanya "dilemparkan ke" teks perintah, dan hasilnya disaring dan dipesan oleh City.
Tentu saja, ini adalah contoh yang disederhanakan, DBA Anda mungkin akan memberi Anda skrip yang lebih kompleks, tetapi Anda mendapatkan ide: Cukup tambahkan kelas hasil pendukung yang berisi semua bidang dari klausa SELECT dan kemudian Anda dapat langsung menggunakannya .
Anda bahkan dapat mengambil hasilnya dari prosedur tersimpan dengan cara ini dan menggunakannya di Linq. Seperti yang Anda lihat, dalam contoh ini saya tidak peduli tentang tipe data dan gunakan dynamicuntuk mengekspresikannya.
Jadi ini benar-benar tentang pemrograman cepat untuk dapat menganalisis data dengan cepat. Anda seharusnya tidak melakukan ini dalam aplikasi Anda yang sebenarnya karena berbagai alasan (injeksi SQL, karena Anda dapat menggunakan EF sejak awal dll).


PanelManager

Gambar di LinqPad, bagian 1

Untuk menggunakan contoh di bawah, tekan F4dan menambahkan System.Windows.dll, System.Windows.Forms.dll, WindowsFormsIntegration.dll, PresentationCore.dlldan PresentationFramework.dllprogram LINQPad Anda dan juga menambahkan namespace System.Windows.Shapes.

Contoh pertama hanya menggambar garis:

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

Contoh ke - 2 menunjukkan bagaimana Anda dapat menampilkan grafik di LinqPad dengan menggunakan PanelManager. Biasanya LinqPad hanya mendukung objek Wpf. Contoh ini digunakan System.Windows.Forms.Integration.WindowsFormsHostuntuk membuat Windows.Forms.PictureBoxtersedia (terinspirasi oleh ini ):

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

Ini akan membuat gambar berikut (item panel "Grafik" dan "Gambar" ditambahkan oleh contoh di atas):

Menampilkan_Graphic_in_LinqPad

Jika Anda ingin menampilkan gambar dari database Northwind, Anda dapat melakukan hal berikut:
Ubah nama file gambar ke "NorthwindPics.jpg", lalu tambahkan kode berikut di awal metode Main () contoh ke - 2 :

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

Ini akan membaca catatan pertama dari tabel Karyawan dan menampilkan gambar.

Lihatlah tautan berikut untuk mencari tahu lebih lanjut:
Bentuk dan gambar dasar dalam visualisator kustom WPF
LinqPad

Catatan: Anda dapat mencapai hal yang sama tanpa PanelManager juga, seperti contoh berikut, yang saya lihat di sini menunjukkan:

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

Itu menggunakan .Dump()perintah untuk menampilkannya. Anda dapat memanggil image.Dump()beberapa kali dan itu akan menambahkan gambar.


Formulir Windows

Gambar di LinqPad, bagian 2

Contoh berikut, terinspirasi oleh posting ini , menunjukkan bagaimana menerapkan plotter fungsi sederhana di Linqpad 5 menggunakan 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;
}

Itu menggunakan kemampuan LinqPad untuk menampilkan formulir Windows di panel hasil. Menambahkan referensi (tekan ) : , , dan menambahkan semua ruang nama dari majelis ini.
Contoh
F4
System.Drawing.dllSystem.Windows.Forms.dllSystem.Windows.Forms.DataVisualization.dll


Petunjuk tambahan / bacaan lebih lanjut:

  • Ingin menggunakan LinqPad di Visual Studio ? Begini caranya .

  • Perlu memiliki LinqPad sebagai "Aplikasi portabel" ? Baca di sini cara melakukannya.

  • Situs web Joe untuk LinqPad selalu merupakan sumber yang bagus. Di dalam LinqPad, Help -> What's Newmemberi Anda petunjuk tentang fungsi dan metode baru. The LINQPad Forum juga berisi petunjuk bermanfaat.

  • Juga sangat membantu: Artikel ini tentang debugging Linq (Pad).

  • Menggunakan lprun.exe untuk menjalankan kueri LINQ dalam skrip batch Anda . Baca artikel ini untuk lebih jelasnya. Misalnya:
    echo Customers.Take(100) > script.txt
    lprun -lang=e -cxname=CompanyServer.CustomerDb script.txt
    Dalam contoh ini, kueri adalah ekspresi LINQ sederhana. Tentu saja, Anda dapat menyiapkan kueri kompleks juga menggunakan -lang=programuntuk mengaktifkan mode program.

  • Anda dapat menulis metode ekstensi dan menyimpannya di tab Kueri Saya di sisi kiri LinqPad: Item terakhir dari pohon tersebut bernama My Extensions ; klik dua kali untuk membuka file tempat Anda dapat menulis ekstensi yang tersedia untuk semua kueri Anda. Masukkan saja ke dalam kelas statis publik MyExtensions, dan gunakan Main()metode ini untuk memasukkan tes untuk ekstensi Anda.

Mat
sumber
2
suka tip tentang Util.ReadLine <string> ("Enter some json"); Sebelumnya saya biasa menyalinnya dalam file dan kemudian membaca dari sana ... Saya sangat suka tip ini. Terima kasih!
loneshark99
2

Dump adalah metode ekstensi global dan SubmitChanges berasal dari objek DataContext yang merupakan objek System.Data.Linq.DataContext.

LP hanya menambahkan Dump and Disassemble sejauh yang saya ketahui. Meskipun saya akan sangat menyarankan membukanya di Reflector untuk melihat apa lagi yang bisa digunakan. Salah satu hal yang lebih menarik adalah namespace LINQPad.Util yang memiliki beberapa barang yang digunakan oleh LINQPad secara internal.

John
sumber
Catatan: Di versi LinqPad yang lebih baru: Klik .Dump()atau metode lain di editor sumber, tekan F12 untuk "mencerminkan". Ini sekarang dibangun ke dalam alat!
Matt
1

Mencapai batas teks StackOverflow dalam jawaban saya sebelumnya , tetapi masih ada ekstensi yang lebih keren di LinqPad. Salah satunya saya ingin menyebutkan:


Fungsi JavaScript (menggunakan .Dump())

Sejak versi 5.42 beta LinqPad, Anda dapat menanamkan fungsi JavaScript dan memanggilnya langsung dari kode C # Anda. Meskipun ini memiliki beberapa keterbatasan (dibandingkan dengan JSFiddle), ini adalah cara yang bagus untuk dengan cepat menguji beberapa kode JavaScript di LinqPad.

Contoh:

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

Dalam contoh ini, fungsi jsFoodengan satu parameter disiapkan dan disimpan dalam variabel literal. Kemudian, itu diberikan dan dipanggil via .Dump().HtmlElement.InvokeScript(...), melewati parameter testparam.

Fungsi JavaScript digunakan external.Log(...)untuk menampilkan teks di jendela keluaran LinqPad, danalert(...) untuk menampilkan pesan sembulan.

Anda dapat menyederhanakan ini dengan menambahkan kelas / metode ekstensi berikut :

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

Kemudian Anda dapat memanggil contoh sebelumnya sebagai berikut:

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

Itu memiliki efek yang sama, tetapi lebih mudah dibaca (jika Anda ingin melakukan lebih banyak JavaScript ;-)).

Opsi lain, jika Anda suka ekspresi Lambda dan Anda tidak suka menentukan nama fungsi sebagai string setiap kali Anda memanggilnya, Anda bisa melakukan:

var jsFoo = ScriptExtension.CreateJavaScript(
            @"function jsFoo(x) { ...  }"); 
ScriptExtension.RunJavaScript(() => jsFoo, "testparam");

asalkan Anda telah menambahkan fungsi pembantu

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

ke kelas ScriptExtension. Ini akan menyelesaikan nama variabel yang Anda gunakan (di sini jsFoo) yang kebetulan merupakan nama yang sama dengan fungsi JavaScript itu sendiri (Perhatikan bagaimana ekspresi lambda digunakan untuk menyelesaikan nama variabel, ini tidak dapat dilakukan dengan menggunakan nameof(paramName)di dalam fungsi).


.Dump () - memperbarui pesan sebaris

Kadang-kadang berguna untuk menimpa teks yang Anda buang daripada meletakkannya ke baris baru, misalnya jika Anda melakukan kueri yang sudah berjalan lama dan ingin menampilkan progresnya, dll (lihat juga ProgressBar di bawah). Ini dapat dilakukan dengan menggunakan DumpContainer, Anda dapat menggunakannya seperti yang ditunjukkan pada

Contoh 1:

void Main()
{
   var dc = new DumpContainer("Doing something ... ").Dump("Some Action");
   System.Threading.Thread.Sleep(3000); // wait 3 seconds
   dc.Content += "Done.";
}

DumpContainerAnimation

Perhatikan bahwa untuk beberapa objek yang lebih kompleks, Anda mungkin harus menggunakan dc.UpdateContent(obj);daripada dc.Content=....

Contoh 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

Menampilkan kemajuan juga dapat dilakukan dengan menggunakan ProgressBar sebagai berikut:

Contoh:

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";
}

Ini mirip dengan contoh dump sebelumnya, tetapi kali ini menampilkan animasi progress bar yang bagus.


Unit testing dengan LinqPad - xUnit

Tahukah Anda bahwa Anda dapat menulis unit test di LinqPad? Misalnya, Anda dapat menggunakan kerangka kerja xUnit. Ini tersedia melalui dukungan NUGET LinqPad - via F4- di klik dialog Add NUGET..... Berikut ini adalah deskripsi langkah demi langkah cara menggunakan xUnit dengan LinqPad V5 atau V6.


Jika saya menemukan lebih banyak, saya akan memperbarui jawaban ini

Mat
sumber