Adakah yang punya daftar lengkap metode dan metode ekstensi LINQPad, seperti
.Dump()
SubmitChanges()
Adakah yang punya daftar lengkap metode dan metode ekstensi LINQPad, seperti
.Dump()
SubmitChanges()
Jawaban:
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:
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:user@domain.com", "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 :
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 DumpContainer
sendiri di tempat yang tepat.
Menggunakan:
var dc = new DumpContainer();
dc.Content = "Test";
// further down in the code
dc.Content = "Another test";
OnDemand
adalah 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 OnDemand
di 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);
}
Selain terkenal myQuery.Dump("Query result:")
, fitur lain untuk disebutkan adalah Util
kelas: 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):
(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 a
dan c
menyembunyikan b
dan d
, contoh 2 melakukan sebaliknya (perhatikan bahwa hanya menetapkan 2 parameter yang tersedia). Variabel y
dan z
tidak 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 dibuangdepth
[int?] - membatasi seberapa dalam objek diperiksa secara rekursiftoDataGrid
[bool] - jika benar, output diformat sebagai datagrid daripada sebagai RichTextexclude
[string] - jika Anda memberikan daftar variabel yang dipisahkan koma, mereka akan dikeluarkan dari output (dalam contoh "a, c": b
dan d
ditampilkan, a
dan c
disembunyikan)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": b
dan d
ditampilkan, semua lainnya disembunyikan)var x=Util.ToExpando(obj, "a, c", "b, d"); x.Dump();
.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 customerObject
hanya jika Anda tertarik.Topik lebih lanjut tentang Dump dapat ditemukan di sana - sini .
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\UserName
saya akan menggunakan System.Security.Principal.WindowsIdentity.GetCurrent().Name
daripada Environment.UserDomainName+@"\"+Environment.UserName
.
( baru: tersedia sejak LinqPad versi v4.45.05 (beta) )
Util.WriteCsv (Customers, @"c:\temp\customers.csv");
Ini akan menulis konten tabel Customers
ke file CSV c:\temp\customers.csv
. Anda juga dapat menemukan contoh yang bagus bagaimana menggunakan Util.WriteCsv
dan 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 attr1
yang 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.
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\Passwords
bentuk 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();
}
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 /s
switch digunakan untuk recurse semua subdirektori dan /b
digunakan 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 dir
karena 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);
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();
Menggunakan Util.ProgressBar
memungkinkan 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.Progress
untuk 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.
Menampilkan HTML di jendela output. Contoh:
Util.RawHtml (new XElement ("h1", "This is a big heading")).Dump();
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).
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><RuntimeDirectory>\System.Web.Extensions.dll</Reference>
<Namespace>System.Web.Script.Serialization</Namespace>
</Query>
void Main()
{
var jsonData=Util.ReadLine<string>("Enter JSON string:");
var jsonAsObject = new JavaScriptSerializer().Deserialize<object>(jsonData);
jsonAsObject.Dump("Deserialized JSON");
}
Sekarang Anda dapat menjalankannya dan cukup menempelkan string JSON dari clipboard ke konsol - itu akan menggunakan Dump
fungsi untuk menampilkannya sebagai objek dengan baik - dan Anda juga mendapatkan pesan kesalahan parser di layar untuk memperbaiki masalah. Sangat berguna untuk debugging AJAX.
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
).
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
:
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)
( 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.exe
akan 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", "test@foo.com", "test@foo.com", "Test Subject" };
#endif
args.Dump("Args");
}
Ini memungkinkan Anda untuk memeriksa apakah skrip dijalankan dari dalam LinqPad GUI atau melalui lprun.exe
atau 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
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.
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.
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!
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.OleDb
dari System.Data
rakitan 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 myDS
ke 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 dynamic
untuk 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).
Gambar di LinqPad, bagian 1
Untuk menggunakan contoh di bawah, tekan F4dan menambahkan System.Windows.dll
, System.Windows.Forms.dll
, WindowsFormsIntegration.dll
, PresentationCore.dll
dan PresentationFramework.dll
program 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.WindowsFormsHost
untuk membuat Windows.Forms.PictureBox
tersedia (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):
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.
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.
F4
System.Drawing.dll
System.Windows.Forms.dll
System.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 New
memberi 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=program
untuk 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.
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.
.Dump()
atau metode lain di editor sumber, tekan F12 untuk "mencerminkan". Ini sekarang dibangun ke dalam alat!
Mencapai batas teks StackOverflow dalam jawaban saya sebelumnya , tetapi masih ada ekstensi yang lebih keren di LinqPad. Salah satunya saya ingin menyebutkan:
.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 jsFoo
dengan 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).
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.";
}
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!");
}
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.
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