Herkes gibi LINQPad uzantısı yöntemleri ve yöntemleri tam bir listesi var mı
.Dump()
SubmitChanges()
Herkes gibi LINQPad uzantısı yöntemleri ve yöntemleri tam bir listesi var mı
.Dump()
SubmitChanges()
Yanıtlar:
LINQPad iki uzantı yöntemi (LINQPad.Extensions içinde), yani Dump()
ve Disassemble()
. Dump()
LINQPad çıktı biçimlendiricisini kullanarak çıktı penceresine yazar ve bir başlık belirtmenize izin vermek için aşırı yüklenir:
typeof (int).Assembly.Dump ();
typeof (int).Assembly.Dump ("mscorlib");
Varsayılan 5 düzey geçersiz kılmak için bir maksimum özyineleme derinliği de belirleyebilirsiniz:
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 () yöntemi IL
, çıktıyı bir dizede döndürerek herhangi bir yöntemi parçalarına ayırır :
typeof (Uri).GetMethod ("GetHashCode").Disassemble().Dump();
Bu iki uzatma yöntemine ek olarak, LINQPad.Util içinde bazı yararlı statik yöntemler vardır. Bunlar otomatik tamamlamada belgelenmiştir ve şunları içerir:
LINQPad ayrıca HyperLinq sınıfını da sağlar. Bunun iki amacı vardır: Birincisi sıradan köprüler görüntülemek:
new Hyperlinq ("www.linqpad.net").Dump();
new Hyperlinq ("www.linqpad.net", "Web site").Dump();
new Hyperlinq ("mailto:user@domain.com", "Email").Dump();
Bunu aşağıdakilerle birleştirebilirsiniz Util.HorizontalRun
:
Util.HorizontalRun (true,
"Check out",
new Hyperlinq ("http://stackoverflow.com", "this site"),
"for answers to programming questions.").Dump();
Sonuç:
Programlama sorularının cevapları için bu siteye göz atın .
HyperLinq'in ikinci amacı dinamik olarak sorgular oluşturmaktır:
// 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'de kendi uzantı yöntemlerinizi de yazabilirsiniz. 'Sorgularım'a gidin ve' Uzantılarım 'sorgusunu tıklayın. Burada tanımlanan türlere / yöntemlere tüm sorgular erişilebilir:
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) 'de yeni sınıflar ve yöntemler tanıtılmıştır :
Ayrıca, Hyperlinq sınıfı artık bağlantıyı tıklattığınızda çağrılacak bir Eylem temsilcisini destekleyerek yalnızca dış web sayfalarına bağlanmakla kalmayıp kodda yanıt vermenize olanak tanır.
DumpContainer
çıktı penceresine içeriğini değiştirebilecek bir blok ekleyen bir sınıftır.
NOT! Unutmayın uygun noktaya kendisi..Dump()
DumpContainer
Kullanmak:
var dc = new DumpContainer();
dc.Content = "Test";
// further down in the code
dc.Content = "Another test";
OnDemand
parametresinin içeriğini çıktı penceresine göndermeyecek, bunun yerine tıklanabilir bir bağlantı ekleyecek, tıklandığında bağlantıyı .Dump()
parametrenin ed içeriğiyle değiştirecek bir uzantı yöntemidir . Bu, bazen ihtiyaç duyulan veya çok fazla yer kaplayan bazen ihtiyaç duyulan veri yapıları için mükemmeldir.
NOT! Uygun yerde .Dump()
arama sonuçlarını hatırlayın OnDemand
.
Kullanmak için:
Customers.OnDemand("Customers").Dump(); // description is optional
Util.ProgressBar
çıktı penceresinin içinde, kod ilerledikçe değiştirilebilen bir grafik ilerleme çubuğu gösterebilen bir sınıftır.
NOT! Unutmayın .Dump()
, uygun bir noktada Util.ProgressBar nesne.
Kullanmak için:
var pb = new Util.ProgressBar("Analyzing data");
pb.Dump();
for (int index = 0; index <= 100; index++)
{
pb.Percent = index;
Thread.Sleep(100);
}
Bilindiği gibi myQuery.Dump("Query result:")
, bir başka özellik de Util
sınıftır: Oldukça kullanışlı birçok yöntem içerir (bazıları bahsettiğim, ancak çok daha fazlası var).
Ayrıca ilginç olan, çalışma şeklini değiştirebilmenizdirDump()
.
Son olarak , LinqPad'in iç bağlantı nesnesini nasıl kullanabileceğinizi veya nasıl değiştirebileceğinizi (örn. LINQ sorgularını ekleme, güncelleme, silme ) nasıl yapabileceğinizi göstereceğim.SubmitChanges()
SaveChanges()
Ve bunu yuvarlamak için , LinqPad'in (çizim çizgileri, bitmapler veya fonksiyonlar ) içinde nasıl basit 2d grafik oluşturabileceğinizi göstereceğim .
Yani, burada yerleşik LinqPad özelliklerinin bir koleksiyonu ( araçla ilgili kendi deneyimimden):
(LinqPad v5.03.08 ve sonraki sürümlerde bulunan parametreler)
Tüm LinqPad kullanıcıları .Dump()
, (neredeyse) her şeyi tüketen ve basan uzantı yöntemini bilir ve sever .
Ancak birkaç parametre olduğunu biliyor muydunuz? Bu kod snippet'ine bir göz atın:
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 örnek baskılar sadece değişkenler a
ve c
ve gizler b
ve d
, 2 örnek tersini (o belirttiğini not mevcut parametrelerin sadece 2) yapar. Değişkenler y
ve z
en üst düzeyde olmadıklarından ayrı ayrı gizlenemezler.
Aşağıdaki parametreler mevcuttur ( tümü isteğe bağlıdır ):
description
[string] - dökülecek nesne için bir açıklama sağlardepth
[int?] - nesnelerin özyinelemeli olarak ne kadar derinden denetlendiğini sınırlartoDataGrid
[bool] - true olursa, çıktı RichText yerine datagrid olarak biçimlendirilirexclude
[string] - virgülle ayrılmış bir değişkenler listesi sağlarsanız, bunlar çıktıdan hariç tutulur ("a, c" örneğinde: b
ve d
gösterilir a
ve c
gizlenir)exclude
[string] "+" önekiyle - önek, exclude parametresinin mantığını tersine çevirir. Bu, virgülle ayrılmış bir değişkenler listesi sağlarsanız, belirtilenler hariç tümü gizlidir ("+ b, d" örneğinde: b
ve d
gösterilir, diğerleri gizlenir)var x=Util.ToExpando(obj, "a, c", "b, d"); x.Dump();
.OnDemand("click me").Dump();
Bunun yerine kullanırsanız, genişletmek için tıklayabileceğiniz .Dump()
bir bağlantı görüntüler. Değerleri incelemek, örneğin Util.OnDemand("Customer-ID: " + customerObject.ID.ToString(), ()=>customerObject, false).Dump();
her zaman varsayılan başına kimliği göstermek, ancak customerObject
yalnızca ilgilendiğiniz ayrıntıları açıklamak istiyorsanız kullanışlıdır.Döküm hakkında daha ileri konuları burada ve orada bulabilirsiniz .
Bu bir LinqPad uzantısı değil, bir .NET sınıfıdır, ancak yararlı olduğu için yine de bahsedeceğim. Komut dosyalarınızda kullanabileceğiniz birçok yararlı bilgi alabilirsiniz:
Environment.UserDomainName.Dump();
Environment.MachineName.Dump();
Environment.UserName.Dump();
Environment.CurrentDirectory.Dump();
Environment.SystemDirectory.Dump();
NB elde etmek için Domain\UserName
ben kullanırım System.Security.Principal.WindowsIdentity.GetCurrent().Name
yerine Environment.UserDomainName+@"\"+Environment.UserName
.
( yeni: LinqPad sürüm v4.45.05 (beta) tarihinden beri kullanılabilir )
Util.WriteCsv (Customers, @"c:\temp\customers.csv");
Bu, tablonun içeriğini Customers
CSV dosyasına yazar c:\temp\customers.csv
. Ayrıca nasıl kullanılacağını güzel bir örnek bulabilirsiniz Util.WriteCsv
ve sonra LINQPad en sonuç penceresinde CSV verileri görüntülemek burada .
İpuçları:
Sorgu ile aynı dizinde bulunan bir CSV dosyası almak / oluşturmak için aşağıdakileri kullanabilirsiniz:
var csvFile=Util.CurrentQueryPath.Replace(".linq", ".csv");
Tablo büyükse, ObjectTrackingEnabled = false;
CSV'yi yazmadan önce bellekte önbelleğe almaktan kaçının.
Virgülle ayrılmış dosya yerine XML biçiminde bir tablo çıktısı almak istiyorsanız, tabloyu aşağıdaki gibi yapabilirsiniz:
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();
Bu örnek , sorgu ile aynı ada sahip ve aynı yolda bulunan bir XML dosyasındaki attr1
değeri içeren özniteliğe sahip tüm öğeleri döndürür "a"
. Daha fazla kod örneği için bu bağlantıya göz atın .
var pwd = Util.GetPassword("UserXY");
Bu, LinqPad'in yerleşik şifre yöneticisinden şifreyi alır. Oluşturmak ve şifresini değiştirmek, açmak için "Şifre yöneticisi" menü öğesi içinde "Dosya" menüsünden LINQPad arasında. C # kodunu çalıştırdığınızda kaydedilmiş bir şifre yoksa, sizden şifreyi soran bir şifre iletişim kutusu açılır ve şifreyi kaydet onay kutusunu işaretleyerek (örnekte şifre) oluşturma ve kaydetme seçeneğiniz vardır. "UserXY" kaydedildi ve daha sonra bu girişi Şifre yöneticisinde bulabilirsiniz ).
Avantajları, parolayı, Windows kullanıcı profilinde ( %localappdata%\LINQPad\Passwords
dosya olarak depolanır) güvenli, ayrı ve şifreli olarak oluşturduğunuz LinqScripts'te saklayabilmenizdir . LinqPad, parolayı korumak için Windows DPAPI kullanır.
Ayrıca, şifre merkezi olarak saklanır, bu yüzden değiştirmeniz gerekirse, menüde yapabilirsiniz ve oluşturduğunuz tüm komut dosyaları için hemen uygulanır.
Notlar:
Parolayı kaydetmek ve sadece bir parola iletişim kutusu açmak istemiyorsanız, 2. parametreyi aşağıdaki gibi kullanabilirsiniz:
var pwd = Util.GetPassword("UserXY", true);
Bu parola iletişim kutusundaki parolayı kaydet onay kutusunun işaretini kaldıracaktır (ancak, kullanıcı hala parolayı kontrol edebilir ve yine de kaydetmeyi seçin).
Parolanın a depolanmasını SecureString
istiyorsanız, bu yardımcı işlevi kullanabilirsiniz (nb: uzantı yöntemini .ToSecureString()
kullanmak için lütfen Stackoverflow adresindeki bu bağlantıyı izleyin - gerekirse geri dönüştürmenizi de sağlar):
System.Security.SecureString GetPasswordSecure(string Name, bool noDefaultSave=true)
{
return Util.GetPassword(Name, noDefaultSave)
.ToSecureString();
}
Bu yöntem bir komut işlemcisi gibi çalışır. Windows konsolundan bildiğiniz tüm komutları çağırabilirsiniz.
Örnek 1 - dir:
Util.Cmd(@"dir C:\");
Bu, dizinin sonucunu gerek kalmadan .Dump
çıkarır. Bir değişkende saklamanın avantajı, üzerinde daha fazla Linq sorgusu kullanabilmenizdir. Örneğin:
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();
Bu, ".exe" veya ".dll" dosya uzantılarına sahip tüm dosyaları dökecektir C:\windows\system32
. /s
Anahtar tüm alt klasörler için kullanılır ve /b
çıplak çıktı biçimi kullanılır. Cmd yönteminin ikinci parametresinin, Dump yöntemini kullanarak yalnızca filtrelenmiş sonucu göstermek için konsol çıktısını bastırmak üzere belirtildiğini unutmayın.
dir
Linq'in sorgu motorunun tam esnekliğini kullanabildiğiniz için bunun sahip olduğunuz joker karakterlerden daha esnek olduğunu görebilirsiniz.
Örnek 2 - Metin düzenleyici:
Not Defteri'nde şu şekilde bir dosya açabilirsiniz:
var filePath=@"C:\HelloWorld.txt";
Util.Cmd(@"%systemroot%\system32\notepad.exe", filePath);
Bir URL'deki resimleri görüntüler. Misal:
var url = "http://chart.apis.google.com/chart?cht=p3&chd=s:Uf9a&chs=350x140&chl=January|February|March|April";
Util.Image(url).Dump();
Seçeneğini kullanmak Util.ProgressBar
bir ilerleme çubuğu görüntülemenizi sağlar. Aşağıdaki yardımcı sınıfı kullanabilirsiniz:
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;
}
}
}
Aşağıdaki örnekte gösterildiği gibi kullanın:
void Main()
{
var pb1= new ProgressBar();
Thread.Sleep(50);
pb1.Update(50, "Doing something"); Thread.Sleep(550);
pb1.Update(100); Thread.Sleep(50);
}
Alternatif olarak Util.Progress
LinqPads entegre ilerleme çubuğunu güncellemek için kullanabilirsiniz , örneğin:
Util.Progress = 25; // 25 percent complete
Fark, sonuç penceresinde görüntülenmeyecek olması ve ona bir mesaj atayamamanızdır.
Çıkış penceresinde HTML'yi görüntüler. Misal:
Util.RawHtml (new XElement ("h1", "This is a big heading")).Dump();
Bu örnek işlevi kullanabilirsiniz
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);
}
sonuç penceresinde köprüleri veya favori düzenleyicinizi açmak gibi işlemleri göstermek için Kullanımı:
ShowUrl("http://stackoverflow.com", "Check out StackOverflow");
Not ederken bu fonksiyon hep çalıştığını new Hyperlinq ("http://myURL", "Web site").Dump();
URL'lerin çeşit işi yapmaz (özellikle, sizin gibi liman adlarını geçmek zorunda olmadığını: URL'nin bir parçası olarak "1234").
Konsoldan girişi okur. Misal:
int age = Util.ReadLine<int> ("Enter your age");
İle eşanlamlı olarak Util.ReadLine<string>()
kullanabilirsiniz Console.ReadLine()
.
Ama dahası da var! Aşağıdaki snippet ile basit bir JSON ayrıştırıcı oluşturabilirsiniz - örneğin, bir JSON dizesini anında ayrıştırmak ve test etmek istiyorsanız oldukça kullanışlıdır. Bir metin düzenleyicisi kullanarak aşağıdaki snippet'i JSONAnalyzer.linq olarak kaydedin ve ardından LinqPad'de açın (bu, referansları anında eklemektir):
<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");
}
Şimdi çalıştırabilir ve bir JSON dizesini panodan konsola yapıştırabilirsiniz - Dump
işlevi güzel bir nesne olarak görüntülemek için işlevi kullanır - ve ayrıca sorunları gidermek için ayrıştırıcının hata mesajlarını ekranda alırsınız. AJAX hata ayıklama için çok yararlıdır.
Komut dosyanızın içindeki sonuçlar penceresini temizlemeniz gerekiyorsa, şunu kullanın:
Util.ClearResults();
Komut dosyanızın en üstünde kullanın ya da - bir komut dosyasında birden çok sorgu çalıştırıyorsanız - ekranı kapatmadan önce kullanıcı girişini beklemelisiniz (örn Util.ReadLine
.
Ayrıca ilginç olan, .Dump()
yöntemin çıktısını değiştirebilmenizdir . Sadece arayüzü uygulayın ICustomMemberProvider
, ör.
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
}
Bu sınıfın bir örneğini oluşturursanız, örneğin
var obj1 = new test();
obj1.Dump("Test");
o zaman çıktısı sadece Hint
, constMember1
, constMember2
, ve myprop
ancak özellik xyz
:
Bir mesaj kutusu görüntülemeniz gerekiyorsa, nasıl yapılacağına buradan bakın .
Örneğin, aşağıdaki kodu kullanarak bir InputBox görüntüleyebilirsiniz
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 tuşuna basmayı ve bu işi yapmak için Microsoft.VisualBasic.dll ve ad alanlarını eklemeyi unutmayın)
( yeni: LinqPad sürüm v4.52.1 (beta) sürümünden beri kullanılabilir )
Komut dosyanızın içinden veya kendi .NET programınızdan veya Windows hizmetinizden başka bir LINQPad komut dosyası çalıştırmanıza olanak tanır (LINQPad4-AnyCPU sürümüne başvurarak LINQPad.exe
). Komut dosyasını, komut satırı aracının yaptığı gibi yürütür lprun.exe
.
Örnekler:
const string path=@"C:\myScripts\LinqPad\";
var dummy=new LINQPad.QueryResultFormat(); // needed to call Util.Run
Util.Run(path+"foo.linq", dummy);
Bu örnek foo.linq
, aşağıdaki örnek kodu içeren komut dosyasını çalıştırır :
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");
}
Komut dosyasının LinqPad GUI içinden mi yoksa üzerinden lprun.exe
mi çalıştırıldığını kontrol etmenizi sağlar Util.Run
.
Not: Aşağıdaki çağırma çeşitleri yardımcı olabilir:
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
Eğer kullanıyorsanız LinqToSql yapmak (kalıcı değişiklikler için, isteyebileceğiniz ekleme / güncelleme / silme işlemleri). Veritabanı içeriği LinqPad tarafından örtük olarak yapıldığından, SubmitChanges()
her değişiklikten sonra aşağıda gösterildiği gibi çağırmanız gerekir .
(LinqPad-) Northwind veritabanı örnekleri :
Ekle
var newP = new Products() { ProductID=pID, CategoryID=cID,
ProductName="Salmon#"+pID.ToString() };
Products.InsertOnSubmit(newP);
SubmitChanges();
Güncelleme
var prod=(from p in Products
where p.ProductName.Contains("Salmon")
select p).FirstOrDefault();
prod.ProductName="Trout#"+prod.ProductID.ToString();
SubmitChanges();
Sil
var itemsToDelete=Products.Where(p=> p.ProductName.Contains("Salmon") ||
p.ProductName.Contains("Trout"));
foreach(var item in itemsToDelete) { Products.DeleteOnSubmit(item); }
SubmitChanges();
Not: Önceki örnekler için geçerli kimlikler almak için şunları kullanabilirsiniz:
var cID = (from c in Categories
where c.CategoryName.Contains("Seafood")
select c).FirstOrDefault().CategoryID;
var pID = Products.Count()+1;
onları çağırmadan önce.
Entity Framework kullanıyorsanız değişiklikleri de kalıcı hale getirmek isteyebilirsiniz ( ekleme / güncelleme / silme işlemleri için). Veritabanı içeriği LinqPad tarafından örtük olarak yapıldığından, SaveChanges()
her değişiklikten sonra aşağıda gösterildiği gibi çağırmanız gerekir .
Örnekler temelde LinqToSQL için olanlarla aynıdır , ancak SaveChanges()
bunun yerine kullanmanız ve yöntemleri eklemek ve silmek için de değişmiştir.
Ekle
var newP = new Products() { ProductID=pID, CategoryID=cID,
ProductName="Salmon#"+pID.ToString() };
Products.Add(newP);
SaveChanges();
Güncelleme
var prod=(from p in Products
where p.ProductName.Contains("Salmon")
select p).FirstOrDefault();
prod.ProductName="Trout#"+prod.ProductID.ToString();
SaveChanges();
Sil
var itemsToDelete=Products.Where(p=> p.ProductName.Contains("Salmon") ||
p.ProductName.Contains("Trout"));
foreach(var item in itemsToDelete) { Products.Remove(item); }
SaveChanges();
Not: Önceki örnekler için geçerli kimlikler almak için şunları kullanabilirsiniz:
var cID = (from c in Categories
where c.CategoryName.Contains("Seafood")
select c).FirstOrDefault().CategoryID;
var pID = Products.Count()+1;
onları çağırmadan önce.
In LINQPad , veritabanı bağlam üstündeki combobox kullanarak ve sorgu için doğru veritabanını seçerek otomatik olarak uygulanır. Ancak bazen, örneğin projenizdeki bazı kodları Visual Studio'dan kopyalayıp LinqPad'e yapıştırırsanız, açık bir şekilde başvurmak yararlı olabilir .
Visual Studio projesinden alınan kod snippet'iniz büyük olasılıkla şöyle görünür:
var prod=(from p in dc.Products
where p.ProductName.Contains("Salmon")
select p).FirstOrDefault();
prod.ProductName="Trout#"+prod.ProductID.ToString();
dc.SaveChanges();
Şimdi ne yapmalı dc
? Tabii ki, dc.
sorgunuzdaki her tekrarını kaldırabilirsiniz , ancak çok daha kolaydır. Sadece ekle
var dc=this; // UserQuery
snippet'inizin üst kısmına şöyle:
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();
}
ve kod anında çalışacaktır!
Oleqb ile LinqPad kullanma, bir datatable'ı Linq nesnesine dönüştürme, Linq'de SQL sorguları
Aşağıdaki kod pasajı, LinqPad'i OleDb ile kullanmanıza yardımcı olur. Ekle System.Data.OleDb
dan System.Data
sonra aşağıdaki kodu yapıştırın sorgu özelliklerine montaj 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();
Şimdi LinqPad'e bir SqlServer bağlantısı ekleyin ve bu örneği çalıştırmak için Northwind veritabanını ekleyin.
Not: Seçili bağlantının veritabanını ve sunucusunu almak istiyorsanız, bu kod snippet'ini kullanabilirsiniz:
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();
}
Hatta dönüştürebilirsiniz myDS
içine , Linq bunu nasıl Aşağıdaki soru gösterisi cevaplarını: Linq ile .NET 4 dinamik anahtar kelimesini kullanarak Nice örneklerini
Bir örnek daha: DBA'nızın size bir SQL sorgusu verdiğini ve LinqPad'deki sonuçları analiz etmek istediğinizi varsayalım - tabii ki SQL'de değil Linq'de. Sonra aşağıdakileri yapabilirsiniz:
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;
}
Bu örnekte, DBA'nın SELECT sorgusu yalnızca komut metnine "atılır" ve sonuçlar City tarafından filtrelenir ve sıralanır.
Tabii ki, bu basitleştirilmiş bir örnektir, DBA'nız muhtemelen size daha karmaşık bir komut dosyası verecektir, ancak fikri alıyorsunuz: Sadece SELECT yan tümcesindeki tüm alanları içeren destekleyici bir sonuç sınıfı ekleyin ve ardından doğrudan kullanabilirsiniz .
Saklanan bir yordamın sonucunu bu şekilde bile alabilir ve Linq'de kullanabilirsiniz. Gördüğünüz gibi, bu örnekte veri türünü umursamıyorum ve dynamic
ifade etmek için kullanıyorum.
Dolayısıyla bu, verileri hızlı bir şekilde analiz edebilmek için hızlı programlama ile ilgilidir. Bunu çeşitli nedenlerle gerçek uygulamanızda yapmamalısınız (SQL enjeksiyonu, çünkü EF'i başından beri kullanabilirsiniz).
LinqPad'de grafik çizme, bölüm 1
Aşağıdaki örnekler kullanmak için tuşuna basın F4ve eklemek System.Windows.dll
, System.Windows.Forms.dll
, WindowsFormsIntegration.dll
, PresentationCore.dll
ve PresentationFramework.dll
senin LINQPad programına ve aynı zamanda ad ekleyin System.Windows.Shapes
.
1 örneği sadece bir çizgi çizer:
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 örnek size PanelManager kullanarak LINQPad grafiği görüntüleyebilir nasıl gösterir. Normalde LinqPad yalnızca Wpf nesnelerini destekler. Bu örnek kullanır System.Windows.Forms.Integration.WindowsFormsHost
bir hale getirmek için Windows.Forms.PictureBox
(o esinlenmiştir mevcut bu ):
// 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);
}
Bu, aşağıdaki grafiği oluşturacaktır (yukarıdaki grafiklerle "Grafik" ve "Resim" panel öğeleri eklenir):
İsterseniz Northwind veritabanındaki resimleri görüntülemek, aşağıdakileri yapabilirsiniz:
Değişim resim dosyası adı "NorthwindPics.jpg", sonra başına şu kodu ekleyin 2 Örnekteki Main () metodu:
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();
}
Çalışanlar tablosundan ilk kaydı okuyacak ve resmi gösterecektir.
Daha fazla bilgi için aşağıdaki bağlantılara göz atın:
WPF LinqPad özel görselleştiricilerindeki şekiller ve temel çizim
Not: Aynı şeyi PanelManager olmadan da elde edebilirsiniz, burada gördüğüm aşağıdaki örnekte gösterildiği gibi:
// 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()
Göstermek için komutu kullanıyor . image.Dump()
Birden çok kez çağırabilirsiniz ve görüntü eklenir.
LinqPad'de grafik çizme, bölüm 2
Esinlenerek Aşağıdaki örnek, bu yazı, C # 7 kullanarak LINQPad 5 basit fonksiyon plotter nasıl uygulanacağını gösteriyor:
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;
}
Sonuçlar panelinde Windows formlarını görüntülemek için LinqPad özelliğini kullanmaktadır.
Ekle referansları (basın ) : , , ve bu meclislerin tüm ad alanlarını ekleyin.
F4
System.Drawing.dll
System.Windows.Forms.dll
System.Windows.Forms.DataVisualization.dll
Ek ipuçları / ek okuma:
Visual Studio'da LinqPad kullanmak ister misiniz ? İşte bunu nasıl .
"Taşınabilir bir uygulama" olarak LinqPad olması gerekir ? Bunu nasıl yapacağınızı buradan okuyun .
Joe'nun LinqPad web sitesi her zaman mükemmel bir kaynaktır. LinqPad içinde, Help -> What's New
yeni işlevler ve yöntemler hakkında ipuçları verir. LINQPad Forum da yararlı ipuçları içeriyor.
Ayrıca çok yararlı: Linq (Pad) hata ayıklama hakkında bu makale.
Kullanım lprun.exe
için LINQ sorguları çalıştıran sizin de toplu komut. Daha fazla bilgi için bu makaleyi okuyun . Örneğin:
echo Customers.Take(100) > script.txt
lprun -lang=e -cxname=CompanyServer.CustomerDb script.txt
Bu örnekte, sorgu basit bir LINQ ifadesidir. Elbette -lang=program
, program modunu etkinleştirmek için kullanarak karmaşık sorgular da hazırlayabilirsiniz .
Uzantı yöntemleri yazıp bunları LinqPad'in sol tarafındaki Sorgularım sekmesinde depolayabilirsiniz : Ağacın son öğesi Uzantılarım olarak adlandırılır ; tüm sorgularınız için mevcut olan uzantıları yazabileceğiniz bir dosyayı açmak için üzerine çift tıklayın. Bunları genel statik sınıfa koyun MyExtensions
ve Main()
uzantılarınız için testler eklemek için yöntemi kullanın.
Döküm bir global uzantı yöntemidir ve SubmitChanges bir System.Data.Linq.DataContext nesnesi olan DataContext nesnesinden gelir.
LP bildiğim kadarıyla sadece Boşalt ve Sökme ekler. Yine de kullanılabilecek başka neler olduğunu görmek için Reflektör'de açmanızı şiddetle tavsiye ederim. Daha ilginç şeylerden biri LINQPad.LINQPad tarafından dahili olarak kullanılan bazı güzellikleri olan ad alanına kadar.
.Dump()
Kaynak düzenleyicideki herhangi bir yöntemi veya başka bir yöntemi tıklatın, "yansıtmak" için F12 tuşuna basın . Bu artık araca yerleştirilmiştir!
Ulaşılan StackOverflow metin sınırını benim de önceki cevabı , ancak LINQPad daha serin uzantıları hala vardır. Bahsetmek istediğim onlardan biri:
.Dump()
)LinqPad'in 5.42 beta sürümünden beri JavaScript işlevlerini gömebilir ve doğrudan C # kodunuzdan çağırabilirsiniz. Bunun bazı sınırlamaları olsa da (JSFiddle ile karşılaştırıldığında), LinqPad'de bazı JavaScript kodlarını hızlı bir şekilde test etmenin güzel bir yoludur.
Misal:
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");
}
Bu örnekte, bir jsFoo
parametreli bir işlev hazırlanır ve değişken içinde saklanır literal
. Ardından, .Dump().HtmlElement.InvokeScript(...)
parametre geçilerek oluşturulur ve çağrılır testparam
.
JavaScript işlevi, external.Log(...)
LinqPad'ın çıktı pencerelerinde metin çıktısı almak ve alert(...)
bir açılır mesaj görüntülemek için kullanılır.
Aşağıdaki uzantı sınıfını / yöntemlerini ekleyerek bunu basitleştirebilirsiniz :
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);
}
}
Ardından önceki örneği aşağıdaki gibi çağırabilirsiniz:
// 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");
Bu aynı etkiye sahiptir, ancak okunması daha kolaydır (daha fazla JavaScript ;-) yapmak istiyorsanız).
Başka bir seçenek, Lambda ifadelerini seviyorsanız ve işlev adını her aradığınızda dize olarak belirtmek istemiyorsanız şunları yapabilirsiniz:
var jsFoo = ScriptExtension.CreateJavaScript(
@"function jsFoo(x) { ... }");
ScriptExtension.RunJavaScript(() => jsFoo, "testparam");
yardım işlevini eklediyseniz
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);
}
sınıfa ScriptExtension
. Bu jsFoo
, JavaScript işlevinin kendisi ile aynı ad olan (burada ) kullandığınız değişken adını çözecektir (Değişken adını çözmek için lambda ifadesinin nasıl kullanıldığına dikkat edin, bu nameof(paramName)
işlev içinde kullanılamaz ).
Bazen , uzun süren bir sorgu gerçekleştiriyorsanız ve ilerlemesini göstermek istiyorsanız, örneğin yeni bir satıra koymak yerine döktüğünüz metnin üzerine yazmak yararlı olabilir (ayrıca aşağıdaki ProgressBar'a bakın). Bu, a kullanılarak yapılabilir DumpContainer
,
Örnek 1:
void Main()
{
var dc = new DumpContainer("Doing something ... ").Dump("Some Action");
System.Threading.Thread.Sleep(3000); // wait 3 seconds
dc.Content += "Done.";
}
Not biraz daha karmaşık nesneler için, kullanmak olabileceğini dc.UpdateContent(obj);
ziyade dc.Content=...
.
Örnek 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!");
}
İlerlemeyi göstermek, aşağıdaki gibi bir ProgressBar kullanılarak da yapılabilir:
Misal:
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";
}
Bu önceki döküm örneğine benzer, ancak bu sefer hoş bir ilerleme çubuğu animasyonu gösteriyor.
LinqPad'de birim testleri yazabileceğinizi biliyor muydunuz? Örneğin, xUnit çerçevesini kullanabilirsiniz. Aracılığıyla - O LINQPad en Nuget desteği aracılığıyla kullanılabilir F4- iletişim tıklamayla Add NUGET..... İşte xUnit'in LinqPad V5 veya V6 ile nasıl kullanılacağı hakkında adım adım açıklama .
Daha fazlasını keşfedersem, bu yanıtı güncelleyeceğim