LINQPad [uzantı] yöntemleri


144

Herkes gibi LINQPad uzantısı yöntemleri ve yöntemleri tam bir listesi var mı

.Dump()

SubmitChanges()

1
Bu soruyu konu dışı olarak kapatmak için oy kullanıyorum çünkü LINQPad sürekli değişen bir araç, bu soruya sağlam ve somut ve son bir cevap vermek çok kısa bir ömre sahip olacak. Diğer araçlar için benzer soruları teşvik etmemek için konu dışı olarak kapatmayı öneriyorum.
Lasse V. Karlsen

5
Oy hakkında söyleyecek bir şeyim yok, ama kesinlikle bu cevabı kapatmaya katılmıyorum. İlk olarak, soru için yukarı oylara bakın, sonra ilk iki yorum için yukarı oylara bakın. İkincisi, Yusuf'un cevapları nasıl son bir cevaptan daha az olabilir; o şeyi yazdı. Son olarak, diğer uygulamalar belgeleri için Stackoverflow kullanır. Her zaman geliştirme için LinqPad'i kullanıyorum, C # ve Linq sorgularının prototipini oluşturuyor, SQL çalıştırıyor ve Hızlı DBA görevleri ve düzinelerce başka şey yapıyorum. Yani, en azından benim için, cevaplar kesinlikle konuyla ilgili.
EoRaptor013 16:18

3
Kapanış: C # ile ilgili eski sorulara birden fazla cevap ekledim. IMO, bu sitenin temsil ettiği bilgi tabanının teknoloji ilerledikçe değiştirilmesini ve güncellenmesini beklemeliyiz. Gelecekteki güncellemelerin belirli bir zamanda verilen cevapları tehlikeye atabileceği veya geçersiz kılabileceği konu aralığı oldukça geniştir: bunun olabileceği tüm soruları kapatırsak, Stack Overflow çok daha kötü bir kaynak olacaktır! Burada, tam bir liste, hiçbir listeden daha iyi olmayan kısmi bir liste haline gelebilir!
Bob Sammers

Yanıtlar:


255

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:

  • Cmd - kabuk komutu veya harici program yürütür
  • CreateXhtmlWriter - LINQPad'in Dump () biçimlendiricisini kullanan bir metin yazar oluşturur
  • SqlOutputWriter - SQL çıkış penceresine yazan metin yazarını döndürür
  • GetMyQueries , GetSamples - kaydedilmiş sorgularınızı / örneklerinizi temsil eden bir nesne koleksiyonu döndürür (örneğin, Düzenle | Tümünü Ara'yı kullanarak arama gerçekleştirin)
  • Vurgula - Bir nesneyi Dumped olduğunda sarı renkte vurgulanacak şekilde sarar
  • HorizontalRun - bir dizi nesneyi aynı satıra dökmenizi sağlar

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 :

  • DumpContainer (sınıf)
  • OnDemand (uzatma yöntemi)
  • Util.ProgressBar (sınıf)

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

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

33
Yazarın kendisinden gelen bir cevaptan daha iyi bir şey yok!
John

1
Joe, aslında bazı grafik çalışmalarını da prototiplemek istedim ve sonra bir bitmap dökmek istedim; biraz görselleştirme, Grafik, Görüntü, vb. üzerinde çalışmayı istediğiniz bu tür bir çalışma için bir Show yöntemi ile harika olurdu. Muhtemelen yoldaki diğer bazı türler için düzgün görselleştirmeler sağlar.
Bent Rasmussen

... Aslında, çıkış paneline grafik gönderebildiğiniz sürece, geri kalanı için uzantılar oluşturabiliriz.
Bent Rasmussen

3
4.26 beta, Util.RawHtml'yi çağırarak XHTML'yi çıktı akışına enjekte etmenizi sağlar. Www.linqpad.net/beta.aspx adresine gidin (veya RTM için birkaç gün bekleyin).
Joe Albahari

1
Alex - bir çizgiye> 1 şey almak için Util.HorizontalRun kullanın
Joe Albahari

132

Bilindiği gibi myQuery.Dump("Query result:"), bir başka özellik de Utilsı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):


.Dump ()

(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 ave cve gizler bve d, 2 örnek tersini (o belirttiğini not mevcut parametrelerin sadece 2) yapar. Değişkenler yve zen ü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ğlar
  • depth [int?] - nesnelerin özyinelemeli olarak ne kadar derinden denetlendiğini sınırlar
  • toDataGrid [bool] - true olursa, çıktı RichText yerine datagrid olarak biçimlendirilir
  • exclude[string] - virgülle ayrılmış bir değişkenler listesi sağlarsanız, bunlar çıktıdan hariç tutulur ("a, c" örneğinde: bve dgösterilir ave cgizlenir)
  • 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: bve dgösterilir, diğerleri gizlenir)
  • dahil edilen ve hariç tutulan özellikleri bir değişkende depola (LinqPad V5.09.04'ten beri yeni):
    var x=Util.ToExpando(obj, "a, c", "b, d"); x.Dump();
    İlk dize, dahil edilecek özelliklerin listesini, ikinci dize hariç tutulacak listeyi içerir
  • tıklama üzerine genişlet: .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 customerObjectyalnı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 .


çevre

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\UserNameben kullanırım System.Security.Principal.WindowsIdentity.GetCurrent().Name
yerine Environment.UserDomainName+@"\"+Environment.UserName.


Util.WriteCsv

( 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 CustomersCSV dosyasına yazar c:\temp\customers.csv. Ayrıca nasıl kullanılacağını güzel bir örnek bulabilirsiniz Util.WriteCsvve 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 attr1değ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 .


Util.GetPassword

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\Passwordsdosya 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ı SecureStringistiyorsanı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();
    }


Util.Cmd

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. /sAnahtar 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.

dirLinq'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);

Util.Image

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

Util.ProgressBar, Util.Progress

Seçeneğini kullanmak Util.ProgressBarbir 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.ProgressLinqPads 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.


Util.RawHtml

Çıkış penceresinde HTML'yi görüntüler. Misal:

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

Hyperlinq, Util.HorizontalRun

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


Util.ReadLine

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

Şimdi çalıştırabilir ve bir JSON dizesini panodan konsola yapıştırabilirsiniz - Dumpiş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.

JSON


Util.ClearResults

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.


Custom .Dump () - ICustomMemberProvider

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 mypropancak özellik xyz:

Linqpad dökümü


LinqPad'de MessageBox veya InputBox Görüntüleme

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)


Util.Run

( 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.exemi ç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

SubmitChanges () - Linq To SQL

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.


SaveChanges () - Varlık Çerçevesi

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.


this - veritabanı içeriği

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!


this.Connection

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.OleDbdan System.Datasonra 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 myDSiç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 dynamicifade 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).


PanelManager

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.dllve PresentationFramework.dllsenin 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.WindowsFormsHostbir 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):

Showing_Graphic_in_LinqPad

İ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.


Windows Formları

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.
Misal
F4
System.Drawing.dllSystem.Windows.Forms.dllSystem.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 Newyeni 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.exeiç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 MyExtensionsve Main()uzantılarınız için testler eklemek için yöntemi kullanın.


2
Util.ReadLine <string> ("Enter bazı json") hakkında ipucu seviyorum; Daha önce dosyayı kopyalayıp oradan okuyordum ... Bu ipucunu gerçekten çok seviyorum. Teşekkürler!
loneshark99

2

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.


Not: LinqPad'in daha yeni sürümlerinde: .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!
Matt

1

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:


JavaScript işlevleri (kullanma .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 jsFooparametreli 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 ).


.Dump () - satır içi ileti güncelleniyor

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

DumpContainerAnimation

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

Util.ProgressBar

İ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 - xUnit ile birim testi

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.