LINQPad [วิธีการขยาย]


144

ใครบ้างมีรายการทั้งหมดของวิธีการขยาย LINQPad และวิธีการเช่น

.Dump()

SubmitChanges()

1
ฉันลงคะแนนเพื่อปิดคำถามนี้เป็นนอกหัวข้อเนื่องจาก LINQPad เป็นเครื่องมือที่เปลี่ยนแปลงตลอดเวลาการมีคำตอบที่มั่นคงและเป็นรูปธรรมและสุดท้ายในคำถามนี้จะมีชีวิตที่สั้นมาก ฉันเสนอให้ปิดเป็นหัวข้อเพื่อหลีกเลี่ยงการส่งเสริมคำถามที่คล้ายกันสำหรับเครื่องมืออื่น ๆ
Lasse V. Karlsen

5
ไม่ใช่ว่าฉันจะพูดอะไรเกี่ยวกับการลงคะแนน แต่ฉันไม่เห็นด้วยกับการปิดคำตอบนี้ ขั้นแรกให้ดูที่ upvotes สำหรับคำถามจากนั้นดู upvotes สำหรับความคิดเห็นสองข้อแรก ประการที่สองคำตอบจากโจเซฟจะน้อยกว่าคำตอบสุดท้ายได้อย่างไร เขาเขียนสิ่งนั้น ในที่สุดแอปพลิเคชันอื่น ๆ ใช้ Stackoverflow สำหรับเอกสารประกอบ ฉันใช้ LinqPad เพื่อการพัฒนาตลอดเวลาสร้างแบบสอบถาม C # และ Linq รัน SQL และทำงาน DBA ด่วนและอื่น ๆ อีกมากมาย อย่างน้อยสำหรับฉันคำตอบนั้นแน่นอนในหัวข้อ
EoRaptor013

3
การปิดอีกครั้ง: ฉันได้เพิ่มคำตอบสำหรับคำถามเก่า ๆ มากกว่าหนึ่งข้อใน C # เพื่อให้เทคนิคที่ทันสมัยกว่าซึ่งได้รับการแนะนำให้รู้จักกับภาษาตั้งแต่คำถามได้รับคำตอบ IMO เราควรคาดหวังว่าฐานความรู้ของเว็บไซต์นี้จะได้รับการแก้ไขและปรับปรุงเมื่อเทคโนโลยีดำเนินต่อไป ช่วงของหัวข้อที่การอัปเดตในอนาคตสามารถประนีประนอมหรือลบล้างคำตอบที่ได้รับ ณ จุดใดเวลาหนึ่งค่อนข้างกว้าง: หากเราปิดคำถามทั้งหมดที่อาจเกิดขึ้น Stack Overflow จะเป็นทรัพยากรที่ยากจนกว่ามาก! รายการทั้งหมดอาจกลายเป็นรายการบางส่วนซึ่งดีกว่าไม่มีรายการ!
Bob Sammers

คำตอบ:


255

LinqPad กำหนดสองวิธีการขยาย (ใน LINQPad.Extensions) คือและDump() เขียนไปที่หน้าต่างเอาต์พุตโดยใช้ฟอร์แมตเตอร์ของ LINQPad และโอเวอร์โหลดเพื่อให้คุณระบุหัวเรื่อง:Disassemble()Dump()

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

คุณยังสามารถระบุความลึกการเรียกซ้ำสูงสุดเพื่อแทนที่ค่าเริ่มต้น 5 ระดับ:

typeof (int).Assembly.Dump (1);              // Dump just one level deep
typeof (int).Assembly.Dump (7);              // Dump 7 levels deep
typeof (int).Assembly.Dump ("mscorlib", 7);  // Dump 7 levels deep with heading

Disassemble () แยกส่วนของเมธอดใด ๆ ไปที่ILคืนค่าเอาต์พุตในสตริง:

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

นอกจากวิธีการขยายสองวิธีเหล่านี้แล้วยังมีวิธีการแบบคงที่ที่มีประโยชน์ใน LINQPad อีกด้วย เอกสารเหล่านี้มีการเติมข้อความอัตโนมัติและรวมถึง:

  • Cmd - รันคำสั่งเชลล์หรือโปรแกรมภายนอก
  • CreateXhtmlWriter - สร้างตัวเขียนข้อความที่ใช้ฟอร์แมต Dump () ของ LINQPad
  • SqlOutputWriter - ส่งคืนตัวเขียนข้อความที่เขียนไปยังหน้าต่างเอาต์พุต SQL
  • GetMyQueries , GetSamples - ส่งคืนชุดของวัตถุที่เป็นตัวแทนของแบบสอบถาม / ตัวอย่างที่บันทึกไว้ (ตัวอย่างเช่นดำเนินการค้นหาโดยใช้แก้ไข | ค้นหาทั้งหมด)
  • ไฮไลต์ - ล้อมวัตถุเพื่อให้ไฮไลต์เป็นสีเหลืองเมื่อมีการดัมพ์
  • HorizontalRun - ช่วยให้คุณถ่ายวัตถุเป็นชุดในบรรทัดเดียวกัน

LINQPad ยังมีคลาส HyperLinq นี่มีวัตถุประสงค์สองประการข้อแรกคือการแสดงไฮเปอร์ลิงก์สามัญ:

new Hyperlinq ("www.linqpad.net").Dump();
new Hyperlinq ("www.linqpad.net", "Web site").Dump();
new Hyperlinq ("mailto:user@domain.com", "Email").Dump();

คุณสามารถรวมสิ่งนี้กับUtil.HorizontalRun:

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

ผลลัพธ์:

ลองอ่านไซต์นี้เพื่อหาคำตอบสำหรับคำถามการเขียนโปรแกรม

วัตถุประสงค์ที่สองของ HyperLinq คือการสร้างแบบสอบถามแบบไดนามิก:

// 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 ไปที่ 'คำค้นหาของฉัน' และคลิกข้อความค้นหาที่เรียกว่า 'ส่วนขยายของฉัน' ประเภท / วิธีการใด ๆ ที่กำหนดไว้ที่นี่จะสามารถเข้าถึงการสืบค้นทั้งหมด:

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

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

ใน 4.46 (.02) ชั้นเรียนและวิธีการใหม่ได้รับการแนะนำ :

  • DumpContainer (คลาส)
  • OnDemand (วิธีการขยาย)
  • Util.ProgressBar (คลาส)

นอกจากนี้คลาส Hyperlinq ยังรองรับตัวแทนActionที่จะถูกเรียกเมื่อคุณคลิกที่ลิงก์เพื่อให้คุณตอบสนองต่อมันในโค้ดและไม่ใช่แค่ลิงค์ไปยังเว็บเพจภายนอก

DumpContainer เป็นคลาสที่เพิ่มบล็อกลงในหน้าต่างเอาต์พุตที่สามารถแทนที่เนื้อหาได้

บันทึก! อย่าลืมตัวเองอยู่ในจุดที่เหมาะสม.Dump()DumpContainer

ใช้:

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

OnDemandเป็นวิธีการส่วนขยายที่จะไม่แสดงเนื้อหาของพารามิเตอร์ไปยังหน้าต่างเอาต์พุต แต่แทนที่จะเพิ่มลิงก์ที่คลิกได้ซึ่งเมื่อคลิกแล้วจะแทนที่ลิงก์ด้วย.Dump()เนื้อหา ed ของพารามิเตอร์ สิ่งนี้เป็นสิ่งที่ดีสำหรับโครงสร้างข้อมูลที่จำเป็นในบางครั้งซึ่งมีค่าใช้จ่ายสูงหรือใช้พื้นที่มาก

บันทึก! จำ.Dump()ผลลัพธ์ของการโทรOnDemandในจุดที่เหมาะสม

วิธีใช้:

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

Util.ProgressBar เป็นคลาสที่สามารถแสดงแถบความคืบหน้าแบบกราฟิกภายในหน้าต่างเอาต์พุตที่สามารถเปลี่ยนแปลงได้เมื่อโค้ดย้ายไป

บันทึก! อย่าลืม.Dump()วัตถุ Util.ProgressBar ในจุดที่เหมาะสม

วิธีใช้:

var pb = new Util.ProgressBar("Analyzing data");
pb.Dump();
for (int index = 0; index <= 100; index++)
{
    pb.Percent = index;
    Thread.Sleep(100);
}

33
ไม่มีอะไรดีไปกว่าคำตอบจากผู้เขียนเอง!
John

1
โจฉันต้องการต้นแบบงานกราฟิกบางอย่างเช่นกันและต้องการถ่ายทำบิตแมป มันยอดเยี่ยมมากกับวิธีการแสดงสำหรับงานประเภทนี้ที่คุณต้องการให้มีการสร้างภาพข้อมูลทำงานบนกราฟิกรูปภาพ ฯลฯ อาจเป็นไปได้ที่จะให้ภาพข้อมูลที่ดูเป็นระเบียบสำหรับประเภทอื่น ๆ
Bent Rasmussen

... ที่จริงตราบใดที่คุณสามารถส่งกราฟิกไปยังพาเนลเอาต์พุตเราสามารถสร้างส่วนขยายสำหรับส่วนที่เหลือเอง
Bent Rasmussen

3
เบต้า 4.26 ช่วยให้คุณสามารถฉีด XHTML ลงในเอาต์พุตสตรีมได้โดยโทร Util.RawHtml ไปที่ www.linqpad.net/beta.aspx (หรือรอสองสามวันสำหรับ RTM)
Joe Albahari

1
อเล็กซ์ - เพื่อให้ได้> 1 อย่างบนบรรทัดใช้ Util.HorizontalRun
Joe Albahari

132

นอกเหนือจากที่รู้จักกันดีmyQuery.Dump("Query result:")คุณลักษณะที่ต้องพูดถึงคือUtilคลาส: มันมีวิธีการที่ค่อนข้างมีประโยชน์มากมาย (บางส่วนที่ฉันเคยพูดถึง แต่มีอีกมาก)

นอกจากนี้ที่น่าสนใจคือการที่คุณสามารถปรับเปลี่ยนวิธีDump()การทำงาน

ในที่สุดฉันจะแสดงให้คุณเห็นว่าคุณสามารถทำการเปลี่ยนแปลงแบบถาวรได้อย่างไร (เช่นแทรกอัปเดตลบคำสั่ง LINQ) โดยใช้SubmitChanges()หรือSaveChanges()วิธีการเข้าถึงการเชื่อมต่อภายในวัตถุของ LinqPad

และเพื่อสรุปให้ดีขึ้นฉันจะแสดงให้คุณเห็นว่าคุณสามารถสร้างกราฟิก 2 มิติที่เรียบง่ายภายใน LinqPad ได้อย่างไร (วาดเส้นบิตแมปหรือฟังก์ชั่น )

ดังนั้นนี่คือคอลเลกชันของคุณสมบัติที่สร้างขึ้นใน LinqPad (จากประสบการณ์ของฉันเองด้วยเครื่องมือ):


.Dump ()

(พารามิเตอร์ที่มีอยู่ใน LinqPad v5.03.08 ขึ้นไป)

ผู้ใช้ LinqPad ทุกคนรู้จักและชื่นชอบ.Dump()วิธีการขยายซึ่งกินและพิมพ์ (เกือบ) ทุกอย่าง

แต่คุณรู้หรือไม่ว่ามีพารามิเตอร์สองสามตัวที่พร้อมใช้งาน ดูตัวอย่างรหัสนี้:

var obj=new { a="Hello", b=5, c="World", d=new { y=5, z=10 } };
obj.Dump(description: "1st example", depth: 5, toDataGrid: false, exclude: "b,d");
obj.Dump("2nd example", exclude: "a,c");
obj.Dump("2nd example", exclude: "+b,d"); // new in V5.06.06 beta

ตัวอย่างที่ 1พิมพ์เพียงตัวแปรaและcและกลองbและdที่ตัวอย่างที่ 2ไม่ตรงข้าม (ทราบว่าจะระบุเพียง 2 ของพารามิเตอร์ที่มีอยู่) ตัวแปรyและzไม่สามารถซ่อนได้ทีละตัวเพราะมันไม่ได้อยู่ในระดับสูงสุด

มีพารามิเตอร์ต่อไปนี้ ( ทั้งหมดเป็นตัวเลือก ):

  • description [สตริง] - ให้คำอธิบายสำหรับวัตถุที่จะถ่ายโอนข้อมูล
  • depth [int?] - จำกัด ความลึกของวัตถุที่ตรวจสอบซ้ำ
  • toDataGrid [บูล] - ถ้าเป็นจริงเอาต์พุตจะถูกจัดรูปแบบเป็นดาต้ากริดแทนที่จะเป็น RichText
  • exclude[string] - หากคุณระบุรายการตัวแปรที่คั่นด้วยเครื่องหมายจุลภาคตัวแปรเหล่านั้นจะถูกแยกออกจากผลลัพธ์ (ในตัวอย่าง "a, c": bและdแสดงaและcซ่อนอยู่)
  • exclude[string] ด้วยคำนำหน้า "+" - คำนำหน้ากลับค่าตรรกะของพารามิเตอร์แยก ซึ่งหมายความว่าหากคุณระบุรายการตัวแปรที่คั่นด้วยเครื่องหมายจุลภาคทั้งหมดยกเว้นตัวแปรที่ระบุจะถูกซ่อนไว้ (ในตัวอย่าง "+ b, d": bและdจะแสดงขึ้นมาซ่อนทั้งหมด)
  • คุณสมบัติที่รวมไว้และที่แยกในสโตร์ (ใหม่นับตั้งแต่ LinqPad V5.09.04):
    var x=Util.ToExpando(obj, "a, c", "b, d"); x.Dump();
    สตริงแรกมีรายการคุณสมบัติที่จะรวมสตริงที่สองที่จะแยกรายการ
  • ขยายเมื่อคลิก: หากคุณใช้.OnDemand("click me").Dump();แทน.Dump()จะแสดงลิงก์ที่คุณสามารถคลิกเพื่อขยาย มีประโยชน์หากคุณต้องการตรวจสอบค่าเช่นUtil.OnDemand("Customer-ID: " + customerObject.ID.ToString(), ()=>customerObject, false).Dump();แสดง ID ต่อค่าเริ่มต้นเสมอ แต่เปิดเผยรายละเอียดcustomerObjectเฉพาะเมื่อคุณสนใจ

หัวข้อขั้นสูงเพิ่มเติมเกี่ยวกับการถ่ายโอนข้อมูลที่สามารถพบได้ที่นี่และมี


สิ่งแวดล้อม

นี่ไม่ใช่ส่วนขยาย LinqPad แต่เป็นคลาส. NET แต่เนื่องจากมีประโยชน์ฉันจะพูดถึงมันต่อไป คุณสามารถรับข้อมูลที่เป็นประโยชน์มากมายที่คุณสามารถใช้ในสคริปต์ของคุณเช่น:

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

NBสำหรับการได้รับDomain\UserNameผมจะใช้ มากกว่าSystem.Security.Principal.WindowsIdentity.GetCurrent().Name
Environment.UserDomainName+@"\"+Environment.UserName


Util.WriteCsv

( ใหม่:มีให้ตั้งแต่LinqPad เวอร์ชัน v4.45.05 (เบต้า) )

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

นี้จะเขียนเนื้อหาของตารางไปยังไฟล์รูปแบบCustomers CSV c:\temp\customers.csvนอกจากนี้คุณยังสามารถหาตัวอย่างที่ดีวิธีการใช้งานUtil.WriteCsvและแสดงข้อมูล CSV ในหน้าต่างผล LinqPad ของที่นี่

คำแนะนำ:

  • ในการรับ / สร้างไฟล์ CSV ซึ่งอยู่ในไดเรกทอรีเดียวกับแบบสอบถามคุณสามารถใช้:
    var csvFile=Util.CurrentQueryPath.Replace(".linq", ".csv");

  • หากตารางมีขนาดใหญ่ใช้ObjectTrackingEnabled = false;ก่อนที่คุณจะเขียน CSV เพื่อหลีกเลี่ยงการแคชในหน่วยความจำ

  • หากคุณต้องการส่งออกตารางในรูปแบบ XMLแทนที่จะเป็นไฟล์ที่คั่นด้วยเครื่องหมายจุลภาคคุณสามารถทำได้เช่น:

    var xmlFile=Util.CurrentQueryPath.Replace(".linq", ".xml");
    var xml = XElement.Load(xmlFile);
    var query =
      from e in xml.Elements()
      where e.Attribute("attr1").Value == "a"
      select e;
    query.Dump();

    ตัวอย่างนี้ส่งคืนองค์ประกอบทั้งหมดที่มีแอททริบิวต์attr1ซึ่งมีค่า"a"จากไฟล์ XML ซึ่งมีชื่อเหมือนกับเคียวรีและอยู่ในพา ธ เดียวกัน ลองดูลิงค์นี้สำหรับตัวอย่างโค้ดเพิ่มเติม


Util.GetPassword

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

สิ่งนี้จะดึงรหัสผ่านจากตัวจัดการรหัสผ่านของ LinqPad ในการสร้างและเปลี่ยนรหัสผ่านให้เปิด"ผู้จัดการรหัสผ่าน" รายการเมนูในเมนู "แฟ้ม"ของ LinqPad หากไม่มีการบันทึกรหัสผ่านเมื่อคุณเรียกใช้รหัส C # กล่องโต้ตอบรหัสผ่านจะเปิดขึ้นเพื่อขอรหัสผ่านจากคุณและคุณมีทางเลือกในการสร้างและบันทึกรหัสผ่านได้ทันทีโดยทำเครื่องหมายในช่องทำเครื่องหมายบันทึกรหัสผ่าน (ในตัวอย่างรหัสผ่าน สำหรับ "UserXY" จะถูกบันทึกและหลังจากนั้นคุณสามารถค้นหารายการนี้ได้ในเครื่องมือจัดการรหัสผ่าน )

ข้อดีคือคุณสามารถจัดเก็บรหัสผ่านใน LinqScripts ที่คุณสร้างอย่างปลอดภัยแยกต่างหากและเข้ารหัสในโปรไฟล์ผู้ใช้ของ Windows (มันถูกเก็บไว้ใน%localappdata%\LINQPad\Passwordsรูปแบบไฟล์) LinqPad ใช้ Windows DPAPI เพื่อป้องกันรหัสผ่าน

รหัสผ่านจะถูกเก็บไว้ที่ส่วนกลางดังนั้นหากคุณต้องการเปลี่ยนคุณสามารถทำได้ในเมนูและใช้กับสคริปต์ทั้งหมดที่คุณสร้างทันที

หมายเหตุ:

  • หากคุณไม่ต้องการบันทึกรหัสผ่านและเปิดกล่องโต้ตอบรหัสผ่านคุณสามารถใช้พารามิเตอร์ที่ 2 ดังนี้:
    var pwd = Util.GetPassword("UserXY", true);
    นี่จะเป็นการยกเลิกการเลือกช่องทำเครื่องหมายบันทึกรหัสผ่านในกล่องโต้ตอบรหัสผ่าน (อย่างไรก็ตามผู้ใช้ยังสามารถตรวจสอบได้และ เลือกที่จะบันทึกต่อไป)

  • หากคุณจำเป็นต้องใช้รหัสผ่านที่จะเก็บไว้ในที่SecureStringคุณสามารถใช้ฟังก์ชั่นผู้ช่วยนี้ (หมายเหตุ: ที่จะได้รับวิธีการขยาย.ToSecureString()ใช้โปรดทำตามลิงค์นี้ที่ Stackoverflow - นอกจากนี้ยังช่วยให้คุณสามารถแปลงกลับถ้าจำเป็น):
    System.Security.SecureString GetPasswordSecure(string Name, bool noDefaultSave=true)
    {
      return Util.GetPassword(Name, noDefaultSave).ToSecureString();
    }


Util.Cmd

วิธีนี้ใช้งานได้เหมือนกับตัวประมวลผลคำสั่ง คุณสามารถเรียกใช้คำสั่งทั้งหมดที่คุณรู้จักจากคอนโซล Windows

ตัวอย่างที่ 1 - dir:

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

สิ่งนี้จะเอาท์พุทผลลัพธ์ของไดเรกทอรีโดยไม่จำเป็นต้องใช้.Dumpมัน การเก็บไว้ในตัวแปรมีข้อดีที่คุณสามารถใช้การสอบถามเพิ่มเติมของ Linq ตัวอย่างเช่น:

var path=@"C:\windows\system32"; 
var dirSwitch="/s/b";
var x=Util.Cmd(String.Format(@"dir ""{0}"" {1}", path, dirSwitch), true);
var q=from d in x 
        where d.Contains(".exe") || d.Contains(".dll")              
        orderby d
    select d;
q.Dump();

นี้จะถ่ายโอนไฟล์ทั้งหมดที่มีนามสกุลไฟล์ ".exe" หรือ ".dll" C:\windows\system32ที่มีอยู่ใน /sสวิทช์ที่ใช้ในการ recurse ไดเรกทอรีย่อยทั้งหมดและ/bจะใช้สำหรับรูปแบบการออกเปลือย โปรดสังเกตว่าพารามิเตอร์ที่สองของวิธี Cmd ถูกระบุเพื่อระงับเอาต์พุตคอนโซลเพื่อแสดงเฉพาะผลลัพธ์ที่กรองแล้วโดยใช้วิธีการถ่ายโอนข้อมูล

คุณสามารถเห็นได้ว่านี่คือความยืดหยุ่นมากกว่าไวด์การ์ดที่คุณมีdirเนื่องจากคุณสามารถใช้ความยืดหยุ่นเต็มรูปแบบของเคียวรีของ Linq

ตัวอย่างที่ 2 - โปรแกรมแก้ไขข้อความ:

คุณสามารถเปิดไฟล์ใน Notepad แบบนี้:

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

Util.Image

แสดงภาพจาก URL ตัวอย่าง:

var url = "http://chart.apis.google.com/chart?cht=p3&chd=s:Uf9a&chs=350x140&chl=January|February|March|April";
Util.Image(url).Dump();

Util.ProgressBar, Util.Progress

การใช้Util.ProgressBarช่วยให้คุณแสดงแถบความคืบหน้า คุณสามารถใช้คลาสตัวช่วยต่อไปนี้:

public class ProgressBar
{
    Util.ProgressBar prog;

    public ProgressBar() 
    { 
        Init("Processing"); 
    }

    private void Init(string msg)
    {
        prog = new Util.ProgressBar (msg).Dump();
        prog.Percent=0;
    }

    public void Update(int percent)
    {
        Update(percent, null);
    }   

    public void Update(int percent, string msg)
    {
        prog.Percent=percent;
        if (String.IsNullOrEmpty(msg))
        {
            if (percent>99) prog.Caption="Done.";
        }
        else
        {
            prog.Caption=msg;
        }
    }
}

เพียงใช้มันตามตัวอย่างต่อไปนี้แสดง:

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

คุณสามารถใช้Util.Progressเพื่ออัปเดตแถบความคืบหน้าแบบรวมของ LinqPads ได้เช่น:

Util.Progress = 25; // 25 percent complete

ข้อแตกต่างคือมันจะไม่แสดงในหน้าต่างผลลัพธ์และคุณไม่สามารถกำหนดข้อความให้กับมันได้


Util.RawHtml

แสดง HTML ในหน้าต่างเอาต์พุต ตัวอย่าง:

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

Hyperlinq, Util.HorizontalRun

คุณสามารถใช้ฟังก์ชั่นตัวอย่างนี้

public void ShowUrl(string strURL, string Title)
{
    Action showURL = delegate() { Process.Start("iexplore.exe", strURL); };
    var url = new Hyperlinq(showURL, "this link", true);
    Util.HorizontalRun (true, "Click ", url, " for details.").Dump(Title);
}

เพื่อแสดงการเชื่อมโยงหลายมิติในหน้าต่างผลลัพธ์ - หรือการกระทำใด ๆ เช่นการเปิดโปรแกรมแก้ไขรายการโปรดของคุณ การใช้งาน:

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

โปรดทราบว่าฟังก์ชั่นนี้ใช้งานได้ทุกเมื่อในขณะที่ใช้new Hyperlinq ("http://myURL", "Web site").Dump();ไม่ได้กับ URL บางประเภท (โดยเฉพาะถ้าคุณต้องส่งชื่อพอร์ตเช่น ": 1234" ซึ่งเป็นส่วนหนึ่งของ URL)


Util.ReadLine

อ่านอินพุตจากคอนโซล ตัวอย่าง:

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

เป็นคำพ้องสำหรับUtil.ReadLine<string>()คุณสามารถใช้Console.ReadLine()เช่นกัน

แต่มีอีกมาก! คุณสามารถสร้างตัวแยกวิเคราะห์ JSON อย่างง่ายด้วยตัวอย่างต่อไปนี้ - มีประโยชน์มากตัวอย่างเช่นถ้าคุณต้องการแยกวิเคราะห์และทดสอบสตริง JSON ได้ทันที บันทึกตัวอย่างต่อไปนี้เป็นJSONAnalyzer.linqโดยใช้เท็กซ์เอดิเตอร์แล้วเปิดใน LinqPad (นี่เป็นการเพิ่มการอ้างอิงได้อย่างง่ายดายในทันที):

<Query Kind="Program">
    <Reference>&lt;RuntimeDirectory&gt;\System.Web.Extensions.dll</Reference>
    <Namespace>System.Web.Script.Serialization</Namespace>
</Query>

void Main()
{
    var jsonData=Util.ReadLine<string>("Enter JSON string:");
    var jsonAsObject = new JavaScriptSerializer().Deserialize<object>(jsonData);
    jsonAsObject.Dump("Deserialized JSON");
}

ตอนนี้คุณสามารถรันและวางสตริง JSON จากคลิปบอร์ดลงในคอนโซล - มันจะใช้Dumpฟังก์ชั่นเพื่อแสดงมันเป็นวัตถุอย่าง - และคุณยังได้รับข้อความแสดงข้อผิดพลาดของ parser บนหน้าจอเพื่อแก้ไขปัญหา มีประโยชน์มากสำหรับการดีบัก AJAX

JSON


Util.ClearResults

หากคุณต้องการล้างหน้าต่างผลลัพธ์ภายในสคริปต์ของคุณให้ใช้:

Util.ClearResults();

ใช้มันที่ด้านบนสุดของสคริปต์ของคุณหรือ - ถ้าคุณกำลังเรียกใช้หลาย ๆ คำสั่งในสคริปต์ - คุณควรรอให้ผู้ใช้ป้อนข้อมูลก่อนที่จะทำให้หน้าจอว่างเปล่า (เช่นนำหน้าด้วยUtil.ReadLine)


กำหนดเอง. Data () - ICustomMemberProvider

ที่น่าสนใจก็คือคุณสามารถเปลี่ยนผลลัพธ์ของ.Dump()วิธีการได้ เพียงใช้ส่วนต่อประสานICustomMemberProviderเช่น

public class test : ICustomMemberProvider 
{

      IEnumerable<string> ICustomMemberProvider.GetNames() {
        return new List<string>{"Hint", "constMember1", "constMember2", "myprop"};
      }

      IEnumerable<Type> ICustomMemberProvider.GetTypes() 
      {
        return new List<Type>{typeof(string), typeof(string[]), 
            typeof(string), typeof(string)};
      }

      IEnumerable<object> ICustomMemberProvider.GetValues() 
      {
        return new List<object>{
        "This class contains custom properties for .Dump()", 
        new string[]{"A", "B", "C"}, "blabla", abc};
      }

      public string abc = "Hello1"; // abc is shown as "myprop"
      public string xyz = "Hello2"; // xyz is entirely hidden
}

ถ้าคุณสร้างตัวอย่างของคลาสนี้เช่น

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

แล้วมันจะออกเพียงHint, constMember1, constMember2และmypropแต่ไม่ได้ทรัพย์สินxyz:

การถ่ายโอนข้อมูล Linqpad


การแสดง MessageBox หรือ InputBox ใน LinqPad

หากคุณต้องการแสดงกล่องข้อความให้ดูที่นี่วิธีการทำ

ตัวอย่างเช่นคุณสามารถแสดง InputBox โดยใช้รหัสต่อไปนี้

void Main()
{
    string inputValue="John Doe"; 
    inputValue=Interaction.InputBox("Enter user name", "Query", inputValue);
    if (!string.IsNullOrEmpty(inputValue)) // not cancelled and value entered
    {
        inputValue.Dump("You have entered;"); // either display it in results window
        Interaction.MsgBox(inputValue, MsgBoxStyle.OkOnly, "Result"); // or as MsgBox
    }
}

(อย่าลืมกด F4 และเพิ่ม Microsoft.VisualBasic.dll และเนมสเปซเพื่อให้ใช้งานได้)


Util.Run

( ใหม่:มีให้ตั้งแต่LinqPad เวอร์ชัน v4.52.1 (เบต้า) )

ช่วยให้คุณเรียกใช้สคริปต์ LINQPad อื่นจากภายในสคริปต์ของคุณหรือภายในโปรแกรม. NET หรือบริการ Windows ของคุณ (โดยอ้างอิงรุ่น LINQPad4-AnyCPU ของLINQPad.exe) มันรันสคริปต์เช่นเดียวกับเครื่องมือบรรทัดคำสั่งlprun.exeจะทำมัน

ตัวอย่าง:

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

ตัวอย่างนี้เรียกใช้สคริปต์foo.linqซึ่งมีตัวอย่างรหัสต่อไปนี้:

void Main(string[] args)
{
    #if CMD
       "I'm been called from lprun! (command line)".Dump();
    #else
       "I'm running in the LINQPad GUI!".Dump();
       args = new[] { "testhost", "test@foo.com", "test@foo.com", "Test Subject" };
    #endif
    args.Dump("Args");
}

จะช่วยให้คุณตรวจสอบว่าสคริปต์ที่ถูกเรียกใช้จากภายใน LinqPad GUI หรือผ่านทางหรือlprun.exeUtil.Run

หมายเหตุ:ตัวแปรของการเรียกใช้ต่อไปนี้อาจมีประโยชน์:

Util.Run(path+"foo.linq", dummy).Dump(); // obviously dumps the script output!
Util.Run(path+"foo.linq", dummy).Save(path+"foo.log"); // writes output into log
Util.Run(path+"foo.linq", dummy).SaveAsync(path+"foo1.log");     // async output log

SubmitChanges () - Linq สำหรับ SQL

หากคุณใช้LinqToSQLคุณอาจต้องการเปลี่ยนแปลงอย่างถาวร (สำหรับการดำเนินการแทรก / อัปเดต / ลบ ) เนื่องจากบริบทฐานข้อมูลถูกสร้างขึ้นโดย LinqPad คุณต้องโทร SubmitChanges()หลังจากการเปลี่ยนแปลงแต่ละครั้งดังที่แสดงด้านล่าง

ตัวอย่างสำหรับ(LinqPad-)ฐานข้อมูลNorthwind :

แทรก

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

ปรับปรุง

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

ลบ

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

หมายเหตุ:เพื่อรับ ID ที่ถูกต้องสำหรับตัวอย่างก่อนหน้านี้คุณสามารถใช้:

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

var pID = Products.Count()+1;

ก่อนที่คุณจะเรียกใช้พวกเขา


SaveChanges () - Entity Framework

หากคุณใช้Entity Frameworkคุณอาจต้องการทำการเปลี่ยนแปลงอย่างถาวรเช่นกัน (สำหรับการดำเนินการแทรก / อัปเดต / ลบ ) เนื่องจากบริบทฐานข้อมูลถูกสร้างขึ้นโดย LinqPad คุณต้องโทร SaveChanges()หลังจากการเปลี่ยนแปลงแต่ละครั้งดังที่แสดงด้านล่าง

ตัวอย่างนั้นเป็นแบบเดียวกับก่อนหน้านี้สำหรับLinqToSQLแต่คุณต้องใช้SaveChanges()แทนและสำหรับการแทรกและการลบวิธีก็เปลี่ยนไปเช่นกัน

แทรก

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

ปรับปรุง

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

ลบ

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

หมายเหตุ:เพื่อรับ ID ที่ถูกต้องสำหรับตัวอย่างก่อนหน้านี้คุณสามารถใช้:

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

var pID = Products.Count()+1;

ก่อนที่คุณจะเรียกใช้พวกเขา


นี่ - บริบทฐานข้อมูล

ในLinqPadที่บริบทของฐานข้อมูลถูกนำไปใช้โดยอัตโนมัติโดยใช้ ComboBox ที่ด้านบนและเก็บฐานข้อมูลที่เหมาะสมสำหรับการค้นหาของคุณ แต่บางครั้งมีประโยชน์ในการอ้างอิงอย่างชัดเจนตัวอย่างเช่นหากคุณคัดลอกโค้ดบางส่วนจากโครงการของคุณออกจากVisual Studioและวางลงใน LinqPad

ข้อมูลโค้ดของคุณที่นำมาจากโครงการ Visual Studio มีแนวโน้มว่าจะเป็นดังนี้:

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

ตอนนี้จะทำอย่างไรกับdc? แน่นอนคุณสามารถลบการเกิดขึ้นแต่ละครั้งdc.ในการสืบค้นของคุณ แต่จะง่ายกว่ามาก เพียงเพิ่ม

var dc=this; // UserQuery

ไปที่ด้านบนสุดของตัวอย่างเช่น:

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

และรหัสจะทำงานทันที!


this.Connection

ใช้ LinqPad กับ OleDb แปลงข้อมูลเป็นวัตถุ Linq แบบสอบถาม SQL ใน Linq

ข้อมูลโค้ดต่อไปนี้ช่วยให้คุณใช้ LinqPad กับ OleDb เพิ่มSystem.Data.OleDbจากSystem.Dataแอสเซมบลีไปยังคุณสมบัติแบบสอบถามแล้ววางรหัสต่อไปนี้ลงในMain():

var connStr="Provider=SQLOLEDB.1;"+this.Connection.ConnectionString; 

OleDbConnection conn = new OleDbConnection(connStr);
DataSet myDS = new DataSet();
conn.Open();

string sql = @"SELECT * from Customers";
OleDbDataAdapter adpt = new OleDbDataAdapter();
adpt.SelectCommand = new OleDbCommand(sql, conn); 
adpt.Fill(myDS);

myDS.Dump();

ตอนนี้เพิ่มการเชื่อมต่อ SqlServer ไปยัง LinqPad และเพิ่มฐานข้อมูล Northwind เพื่อเรียกใช้ตัวอย่างนี้

หมายเหตุ:หากคุณต้องการรับฐานข้อมูลและเซิร์ฟเวอร์ของการเชื่อมต่อที่เลือกในปัจจุบันคุณสามารถใช้ข้อมูลโค้ดนี้:

void Main()
{
    var dc=this;
    var tgtSrv=dc.Connection.DataSource;
    var tgtDb=dc.Connection.ConnectionString.Split(';').Select(s=>s.Trim())
        .Where(x=>x.StartsWith("initial catalog", StringComparison.InvariantCultureIgnoreCase))
        .ToArray()[0].Split('=')[1];
    tgtSrv.Dump();
    tgtDb.Dump();
}

คุณยังสามารถแปลงmyDSเป็นLinqคำตอบของคำถามต่อไปนี้แสดงให้เห็นถึงวิธีการทำ: ตัวอย่างที่ดีของการใช้. NET 4 dynamic keyword กับ Linq

อีกตัวอย่างหนึ่ง: สมมติว่า DBA ของคุณให้คำสืบค้น SQL และคุณต้องการวิเคราะห์ผลลัพธ์ใน LinqPad - แน่นอนใน Linq ไม่ใช่ใน SQL จากนั้นคุณสามารถทำสิ่งต่อไปนี้:

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

ในตัวอย่างนี้เคียวรี SELECT ของ DBA เป็นเพียง "โยนลงไปใน" ข้อความคำสั่งและผลลัพธ์จะถูกกรองและเรียงลำดับโดย City
แน่นอนว่านี่เป็นตัวอย่างแบบง่าย ๆ DBA ของคุณอาจให้สคริปต์ที่ซับซ้อนมากขึ้น แต่คุณได้รับแนวคิด: เพียงเพิ่มคลาสผลการสนับสนุนที่มีฟิลด์ทั้งหมดจากส่วนคำสั่ง SELECT และจากนั้นคุณสามารถใช้งานได้โดยตรง .
คุณยังสามารถรับผลจากขั้นตอนการจัดเก็บด้วยวิธีนี้และใช้ใน Linq อย่างที่คุณเห็นในตัวอย่างนี้ฉันไม่สนใจชนิดข้อมูลและการใช้งานdynamicเพื่อแสดงมัน
ดังนั้นนี่คือการเขียนโปรแกรมที่รวดเร็วเพื่อให้สามารถวิเคราะห์ข้อมูลได้อย่างรวดเร็ว คุณไม่ควรทำสิ่งนี้ในแอปพลิเคชันจริงของคุณด้วยเหตุผลหลาย ๆ อย่าง (การฉีด SQL เนื่องจากคุณสามารถใช้ EF ได้ตั้งแต่ต้นเป็นต้น)


PanelManager

วาดกราฟิคใน LinqPad ตอนที่ 1

ที่จะใช้ตัวอย่างด้านล่างให้กดF4และเพิ่มSystem.Windows.dll, System.Windows.Forms.dll, WindowsFormsIntegration.dll, PresentationCore.dllและPresentationFramework.dllโปรแกรม LinqPad ของคุณและยังเพิ่มการ System.Windows.Shapesnamespace

ตัวอย่างที่ 1เพียงแค่ดึงบรรทัด:

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แสดงให้เห็นว่าคุณสามารถแสดงกราฟิกใน LinqPad โดยใช้ PanelManager ปกติ LinqPad รองรับวัตถุ Wpf เท่านั้น ตัวอย่างนี้ใช้System.Windows.Forms.Integration.WindowsFormsHostเพื่อให้Windows.Forms.PictureBoxพร้อมใช้งาน (ซึ่งได้รับแรงบันดาลใจจากสิ่งนี้ ):

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

สิ่งนี้จะสร้างกราฟิกต่อไปนี้ (เพิ่มรายการตัวอย่าง "กราฟิก" และ "รูปภาพ" ตามตัวอย่างด้านบน):

Showing_Graphic_in_LinqPad

หากคุณต้องการแสดงภาพจากฐานข้อมูล Northwindคุณสามารถทำสิ่งต่อไปนี้:
เปลี่ยนชื่อไฟล์ภาพเป็น "NorthwindPics.jpg" จากนั้นเพิ่มรหัสต่อไปนี้ที่จุดเริ่มต้นของวิธีการหลัก () ตัวอย่างที่ 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();
}

มันจะอ่านบันทึกแรกจากตารางพนักงานและแสดงภาพ

ตรวจสอบลิงค์ต่อไปนี้เพื่อค้นหาเพิ่มเติม:
รูปร่างและการวาดภาพพื้นฐานใน VisualFic Customizer WPF
LinqPad

หมายเหตุ:คุณสามารถทำได้โดยไม่ต้องใช้ PanelManager เช่นเดียวกับตัวอย่างต่อไปนี้ซึ่งฉันเห็นที่นี่แสดงให้เห็น:

// using System.Drawing;
using (var image=new Bitmap(100, 100))
using (var gr = Graphics.FromImage(image))
{
    gr.FillRectangle(Brushes.Gold, 0, 0, 100, 100);
    gr.DrawEllipse(Pens.Blue, 5, 5, 90, 90);
    gr.Save();
    image.Dump();
}

มันใช้.Dump()คำสั่งเพื่อแสดงมัน คุณสามารถเรียกใช้image.Dump()หลายครั้งและมันจะผนวกภาพ


แบบฟอร์ม Windows

วาดกราฟิคใน LinqPad ตอนที่ 2

ตัวอย่างต่อไปนี้แรงบันดาลใจจากนี้โพสต์จะแสดงวิธีการใช้ฟังก์ชั่นล็อตเตอร์ที่เรียบง่ายใน LinqPad 5 ใช้ 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;
}

ใช้ความสามารถของ LinqPad ในการแสดงแบบฟอร์ม Windows ในแผงผลลัพธ์ เพิ่มการอ้างอิง (กด) : , , และเพิ่ม namespaces ทั้งหมดจากผู้ประกอบการเหล่านี้
ตัวอย่าง
F4
System.Drawing.dllSystem.Windows.Forms.dllSystem.Windows.Forms.DataVisualization.dll


คำแนะนำเพิ่มเติม / อ่านเพิ่มเติม:

  • ต้องการใช้ LinqPad ในVisual Studioหรือไม่ นี่คือวิธีการที่คุณสามารถทำเช่นนั้น

  • จำเป็นต้องมี LinqPad เป็น"แอพพกพา"หรือไม่? อ่านที่นี่วิธีการทำ

  • เว็บไซต์ของ Joe สำหรับLinqPadนั้นเป็นแหล่งข้อมูลที่ยอดเยี่ยมเสมอ ภายใน LinqPadHelp -> What's Newให้คำแนะนำเกี่ยวกับฟังก์ชั่นและวิธีการใหม่ ๆ LinqPad ฟอรั่มนอกจากนี้ยังมีคำแนะนำที่เป็นประโยชน์

  • ยังมีประโยชน์มาก: นี้บทความเกี่ยวกับ Linq (Pad) การแก้จุดบกพร่อง

  • ใช้lprun.exeสำหรับเรียกใช้แบบสอบถาม LINQในสคริปต์ชุดงานของคุณ อ่านบทความนี้สำหรับรายละเอียดเพิ่มเติม ตัวอย่างเช่น:
    echo Customers.Take(100) > script.txt
    lprun -lang=e -cxname=CompanyServer.CustomerDb script.txt
    ในตัวอย่างนี้แบบสอบถามเป็นนิพจน์ LINQ อย่างง่าย แน่นอนคุณสามารถจัดทำแบบสอบถามที่ซับซ้อนเช่นเดียวกับการใช้-lang=programเพื่อเปิดใช้งานโหมดโปรแกรม

  • คุณสามารถเขียนวิธีการขยายและเก็บไว้ในแบบสอบถามของฉันแท็บทางด้านซ้ายมือของ LinqPad: รายการสุดท้ายของต้นไม้เป็นชื่อที่ตั้งส่วนขยายของฉัน ; คลิกสองครั้งที่ไฟล์นั้นเพื่อเปิดไฟล์ที่คุณสามารถเขียนส่วนขยายที่มีให้สำหรับทุกข้อสงสัย เพียงแค่ใส่พวกเขาลงในชั้นคงที่สาธารณะMyExtensionsและใช้Main()วิธีการรวมการทดสอบสำหรับส่วนขยายของคุณ


2
รักเคล็ดลับเกี่ยวกับ Util.ReadLine <string> ("Enter some json"); ก่อนหน้านี้ฉันใช้ในการคัดลอกในไฟล์แล้วอ่านจากที่นั่น ... ฉันรักเคล็ดลับนี้ ขอบคุณ!
loneshark99

2

การถ่ายโอนข้อมูลเป็นวิธีการขยายส่วนกลางและ SubmitChanges มาจากวัตถุ DataContext ซึ่งเป็นวัตถุ System.Data.Linq.DataContext

LP เพิ่มเฉพาะการถ่ายโอนข้อมูลและการถอดเท่าที่ฉันทราบ แม้ว่าฉันจะขอแนะนำให้เปิดใน Reflector เพื่อดูว่ามีอะไรอีกบ้างที่สามารถใช้ได้ สิ่งที่น่าสนใจอีกอย่างหนึ่งคือ LINQPad.Util namespace ซึ่งมีสารพัดบางอย่างที่ใช้โดย LINQPad ภายใน


หมายเหตุ:ใน LinqPad เวอร์ชันใหม่กว่า: คลิก.Dump()หรือวิธีอื่นใดในตัวแก้ไขซอร์สกดF12 เพื่อ "สะท้อน" ตอนนี้มีอยู่แล้วภายในเครื่องมือ!
แมตต์

1

ถึงขีด จำกัด ข้อความ StackOverflowในคำตอบก่อนหน้าของฉันแต่ยังมีส่วนขยายที่น่าสนใจใน LinqPad หนึ่งในนั้นที่ฉันต้องการพูดถึง:


ฟังก์ชัน JavaScript (โดยใช้.Dump())

ตั้งแต่เวอร์ชัน5.42 เบต้าของ LinqPad คุณสามารถฝังฟังก์ชั่น JavaScript และเรียกใช้โดยตรงจากรหัส C # ของคุณ แม้ว่าจะมีข้อ จำกัด บางอย่าง (เมื่อเทียบกับ JSFiddle) แต่ก็เป็นวิธีที่ดีในการทดสอบโค้ด JavaScript ใน LinqPad อย่างรวดเร็ว

ตัวอย่าง:

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

ในตัวอย่างนี้ฟังก์ชั่นที่มีพารามิเตอร์หนึ่งคือการจัดทำและเก็บไว้ในตัวแปรjsFoo literalจากนั้นก็มีการแสดงและเรียกร้องผ่านทางผ่านพารามิเตอร์.Dump().HtmlElement.InvokeScript(...)testparam

ฟังก์ชัน JavaScript ใช้external.Log(...)เพื่อแสดงผลข้อความในหน้าต่างแสดงผลของ LinqPad และalert(...)แสดงผลเพื่อแสดงข้อความป๊อปอัพ

คุณสามารถทำให้สิ่งนี้ง่ายขึ้นโดยการเพิ่มคลาส / เมธอดส่วนขยายต่อไปนี้:

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

จากนั้นคุณสามารถเรียกตัวอย่างก่อนหน้าได้ดังนี้:

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

สิ่งนี้มีผลเหมือนกัน แต่อ่านได้ง่ายกว่า (หากคุณต้องการทำจาวาสคริปต์เพิ่มเติม ;-))

ตัวเลือกอื่นถ้าคุณชอบนิพจน์แลมบ์ดาและคุณไม่ต้องการระบุชื่อฟังก์ชั่นเป็นสตริงทุกครั้งที่คุณโทรคุณสามารถทำได้:

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

หากคุณเพิ่มฟังก์ชันผู้ช่วย

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

ScriptExtensionในชั้นเรียน นี่จะแก้ไขชื่อตัวแปรที่คุณใช้ (ที่นี่jsFoo ) ซึ่งเกิดขึ้นเป็นชื่อเดียวกับฟังก์ชัน JavaScript (หมายเหตุว่านิพจน์แลมบ์ดาใช้เพื่อแก้ไขชื่อตัวแปรซึ่งไม่สามารถทำได้โดยใช้nameof(paramName)ภายในฟังก์ชัน)


.Dump () - อัปเดตข้อความแบบอินไลน์

บางครั้งมันจะมีประโยชน์ในการเขียนทับข้อความที่คุณทิ้งแทนที่จะใส่ลงในบรรทัดใหม่ตัวอย่างเช่นหากคุณกำลังดำเนินการค้นหาที่ใช้เวลานานและต้องการแสดงความคืบหน้า ฯลฯ ฯลฯ (ดู ProgressBar ด้านล่าง) สิ่งนี้สามารถทำได้โดยใช้ a DumpContainer, คุณสามารถใช้มันตามที่แสดงใน

ตัวอย่างที่ 1:

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

DumpContainerAnimation

หมายเหตุว่าสำหรับวัตถุที่ซับซ้อนมากขึ้นบางอย่างที่คุณอาจจะต้องใช้มากกว่าdc.UpdateContent(obj);dc.Content=...

ตัวอย่างที่ 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

การแสดงความคืบหน้าสามารถทำได้โดยใช้ ProgressBar ดังนี้:

ตัวอย่าง:

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

นี้คล้ายกับตัวอย่างการถ่ายโอนข้อมูลก่อนหน้า แต่คราวนี้แสดงภาพเคลื่อนไหวแถบความคืบหน้าที่ดี


การทดสอบหน่วยด้วย LinqPad - xUnit

คุณรู้หรือไม่ว่าคุณสามารถเขียนการทดสอบหน่วยใน LinqPad? ตัวอย่างเช่นคุณสามารถใช้กรอบงาน xUnit มันสามารถใช้ได้ผ่านการสนับสนุน NUGET LinqPad ของ - ผ่านF4- Add NUGET....ในคลิกโต้ตอบ ต่อไปนี้เป็นคำอธิบายทีละขั้นตอนวิธี ใช้ xUnit กับ LinqPad V5 หรือ V6


หากฉันค้นพบเพิ่มเติมฉันจะอัปเดตคำตอบนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.