LINQPad [확장] 방법


144

누구든지 다음과 같은 LINQPad 확장 방법 및 방법의 전체 목록을 가지고 있습니까?

.Dump()

SubmitChanges()

1
LINQPad는 끊임없이 변하는 도구이므로이 질문에 대한 견실하고 구체적이며 최종 답변이 매우 짧은 수명을 갖기 때문에이 질문을 논외 주제로 마무리 하려고합니다. 다른 도구에 대한 유사한 질문을 피하기 위해 주제를 벗어나 주제로 닫을 것을 제안합니다.
Lasse V. Karlsen 2018 년

5
투표에 대해 할 말이 없지만이 답변을 마무리하는 데 동의하지는 않습니다. 먼저 질문에 대한 공감대를 살펴본 다음 처음 두 의견에 대한 공판을 살펴보십시오. 둘째, 요셉의 대답이 어떻게 최종 답보다 작을 수 있습니까? 그는 글을 썼습니다. 마지막으로 다른 응용 프로그램은 설명서에 Stackoverflow를 사용합니다. LinqPad를 항상 개발, C # 및 Linq 쿼리 프로토 타이핑, SQL 실행, Quick DBA 작업 및 기타 수십 가지 작업에 사용합니다. 따라서 적어도 저에게는 대답이 분명히 주제에 있습니다.
EoRaptor013

3
다시 닫기 : 질문에 대한 답변 이후 언어에 도입 된보다 현대적인 기술을 제공하기 위해 C #의 이전 질문에 대한 답변을 두 개 이상 추가했습니다. IMO 우리는이 사이트가 나타내는 지식 기반이 기술이 발전함에 따라 수정되고 업데이트 될 것으로 기대해야합니다. 향후 업데이트에서 특정 시점에 제공된 답변을 손상 시키거나 무효화 할 수있는 주제의 범위는 매우 광범위합니다. 이러한 문제가 발생할 수있는 모든 질문을 닫으면 스택 오버플로는 훨씬 더 나쁜 리소스가됩니다! 여기서 완전한리스트는리스트가없는 것보다 나은 부분리스트가 될 수 있습니다!
밥 Sammers

답변:


255

LINQPad는 LINQPad.Extensions에서 두 가지 확장 방법, 즉 Dump()및을 정의합니다 Disassemble(). Dump()LINQPad의 출력 포맷터를 사용하여 출력 창에 쓰고 제목을 지정할 수 있도록 오버로드됩니다.

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.Util에는 유용한 정적 메서드가 있습니다. 이들은 자동 완성으로 문서화되며 다음을 포함합니다.

  • Cmd- 쉘 명령 또는 외부 프로그램을 실행합니다
  • CreateXhtmlWriter -LINQPad의 Dump () 포맷터를 사용하는 텍스트 작성기를 만듭니다.
  • 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 (클래스)
  • 주문형 (확장 방법)
  • 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
Joe, 실제로 일부 그래픽 작업도 프로토 타입으로 만들고 싶었고 비트 맵을 덤프하고 싶었습니다. 그래픽, 이미지 등을 작업하면서 시각화를 원하는 이런 종류의 작업에 Show 메서드를 사용하면 좋을 것입니다.
벤트 라스무센

... 실제로, 그래픽을 출력 패널로 보낼 수있는 한 나머지는 직접 확장 할 수 있습니다.
벤트 라스무센

3
4.26 베타 버전에서는 Util.RawHtml을 호출하여 출력 스트림에 XHTML을 삽입 할 수 있습니다. www.linqpad.net/beta.aspx로 이동하십시오 (또는 RTM을 며칠 기다리십시오).
Joe Albahari

1
알렉스 - 라인에> 1 일을 얻기 위해, Util.HorizontalRun 사용
조 Albahari

131

잘 알려진 것 외에도 myQuery.Dump("Query result:")언급 할 또 다른 기능은 Util클래스입니다. 많은 편리한 메소드가 포함되어 있습니다 (일부 언급했지만 더 많이 있습니다).

또한 흥미로운 점은 작동 방식을 수정할Dump() 수 있다는 것 입니다.

마지막으로 당신이 할 수있는 방법을 보여 드리겠습니다 변경을 영구적으로 (즉, 삽입, 업데이트, 삭제 LINQ 쿼리)를 사용 SubmitChanges()하거나 SaveChanges()당신이 LinqPad의 내부 연결 개체에 액세스 할 수있는 방법을뿐만 아니라.

그리고이를 정리하기 위해 LinqPad 내부에 간단한 2D 그래픽을 만드는 방법 ( 선, 비트 맵 또는 함수 그리기)을 보여 드리겠습니다 .

다음은 내장 LinqPad 기능 모음입니다 (도구 사용 경험).


.덤프()

(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 예제 인쇄 전용 변수 ac와 가죽 bd두번째 예는 반대 (이 지정하는 주 사용 가능한 매개 변수의 2)를 수행합니다. 변수 y와는 z그들이 최상위에 있지 않기 때문에, 개별적으로 숨길 수 없습니다.

다음 매개 변수를 사용할 수 있습니다 ( 모두 선택 사항 임 ).

  • description [문자열]-덤프 할 객체에 대한 설명을 제공합니다.
  • depth [int?]-객체의 재귀 검사 깊이를 제한합니다
  • toDataGrid [bool]-true 인 경우 출력은 RichText가 아닌 데이터 그리드로 형식화됩니다.
  • exclude[문자열] -는 변수의 쉼표로 구분 된 목록을 제공하는 경우, 이들은 출력에서 제외한다 ( "A, C '의 예에서 bd도시되고, ac숨겨진)
  • exclude접두사가 "+"인 [문자열]-접두사는 제외 매개 변수의 논리를 반전시킵니다. 이 수단을 사용하면, 숨겨진 지정된 제외한 모든 변수 쉼표로 구분 된 목록을 제공하는 경우 (이 예에서는 "+ B, D" bd도시되고, 다른 모든 숨겨진)
  • 포함 및 제외 된 속성을 변수에 저장 (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");

테이블의 내용이 CustomersCSV 파일에 기록됩니다 c:\temp\customers.csv. Util.WriteCsvLinqpad의 결과 창에서 CSV 데이터 를 사용 하고 표시하는 방법에 대한 좋은 예를 찾을 수도 있습니다 .

힌트 :

  • 조회와 동일한 디렉토리에있는 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();

    이 예는 조회와 이름이 같고 동일한 경로에 포함 된 XML 파일 attr1의 값을 포함 하는 속성 을 가진 모든 요소를 ​​리턴합니다 "a". 더 많은 코드 샘플은 링크를 확인하십시오 .


Util.GetPassword

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

LinqPad의 내장 비밀번호 관리자에서 비밀번호를 검색합니다. 암호를 생성하고 변경하려면 LinqPad 의 "파일"메뉴 에서 "암호 관리자"메뉴 항목 을여십시오. C # 코드를 실행할 때 저장된 비밀번호가없는 경우 비밀번호를 묻는 비밀번호 대화 상자가 열리고 비밀번호 저장 선택란 (예 : 비밀번호)을 선택 하여 비밀번호 를 작성하여 즉시 저장할 수 있습니다. 에 대한 "UserXY"가 저장되고 나중에 비밀번호 관리자 에서이 항목을 찾을 수 있습니다 .

장점은 Windows 사용자 프로파일에서 안전하게 별도로 생성하고 암호화 한 LinqScripts에 암호를 저장할 수 있다는 것입니다 ( %localappdata%\LINQPad\Passwords파일로 저장 됨 ). LinqPad는 Windows DPAPI를 사용하여 암호를 보호합니다.

또한 비밀번호는 중앙에 저장되므로 비밀번호를 변경해야하는 경우 메뉴에서 비밀번호를 변경할 수 있으며 작성한 모든 스크립트에 즉시 적용됩니다.

노트:

  • 비밀번호를 저장하지 않고 비밀번호 대화 상자를 불러 오려면 다음과 같이 두 번째 매개 변수를 사용하십시오.
    var pwd = Util.GetPassword("UserXY", true);
    그러면 비밀번호 대화 상자에서 비밀번호 저장 선택란 이 선택 취소됩니다 (단, 사용자는 여전히 비밀번호를 확인할 수 있습니다. 어쨌든 저장하도록 선택하십시오).

  • 암호를에 저장 해야하는 SecureString경우이 도우미 기능을 사용할 수 있습니다 (nb : 확장 방법을 .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스위치는 모든 하위 디렉토리를 재귀하는 데 사용되며 /b베어 출력 형식에 사용됩니다. Cmd 메소드의 두 번째 매개 변수는 Dump 메소드를 사용하여 필터링 된 결과 만 표시하기 위해 콘솔 출력을 억제하도록 지정됩니다.

dirLinq 쿼리 엔진의 전체 유연성을 사용할 수 있으므로 이것이 와일드 카드보다 더 유연하다는 것을 알 수 있습니다.

예 2-텍스트 편집기 :

다음과 같이 메모장에서 파일을 열 수 있습니다.

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.ProgressLinqPads 통합 진행률 표시 줄을 업데이트 하는 데 사용할 수도 있습니다 ( 예 :

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이 어떤 종류의 일을하지 않는 (특히, 당신은 같은 포트 이름을 통과해야하는 경우 : URL의 일환으로 "1234").


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기능을 사용하여 객체로 멋지게 표시 할 수 있습니다. 또한 화면에 파서의 오류 메시지가 표시되어 문제를 해결합니다. AJAX 디버깅에 매우 유용합니다.

JSON


Util.ClearResults

스크립트 내에서 결과 창을 지우려면 다음을 사용하십시오.

Util.ClearResults();

스크립트 상단에서 사용하거나 스크립트에서 여러 쿼리를 실행하는 경우 화면을 비우기 전에 사용자 입력을 기다려야합니다 (예 :으로 시작 Util.ReadLine).


사용자 지정 .Dump ()-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 덤프


LinqPad에 MessageBox 또는 InputBox 표시

메시지 상자를 표시해야하는 경우 여기 에서 메시지 상자를 보는 방법을보십시오.

예를 들어 다음 코드를 사용하여 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 (베타) 부터 사용 가능 )

스크립트 내에서 또는 .NET 프로그램 또는 Windows 서비스 내에서 LINQPad4-AnyCPU 버전을 참조하여 다른 LINQPad 스크립트를 실행할 수 있습니다 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다음 샘플 코드가 포함 된 script를 실행합니다 .

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.exe또는 스크립트를 통해 스크립트가 실행되었는지 확인할 수 있습니다 Util.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 To 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를 사용하는 경우 삽입 / 업데이트 / 삭제 작업 을 위해 변경 사항을 영구적으로 적용 할 수 있습니다 . 데이터베이스 컨텍스트는 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;

당신이 그들을 호출하기 전에.


this-데이터베이스 컨텍스트

에서 LinqPad데이터베이스 컨텍스트는 상단에있는 콤보 상자를 사용하여 쿼리에 대한 올바른 데이터베이스를 선택하여 자동으로 적용됩니다. 그러나 때로는 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(); 
}   

코드가 즉시 작동합니다!


이것입니다.

LinqPad를 OleDb와 함께 사용하여 데이터 테이블을 Linq 객체로 변환, Linq의 SQL 쿼리

다음 코드 스 니펫은 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();

이제 LinqPad에 SqlServer 연결을 추가하고이 예제를 실행하려면 Northwind 데이터베이스를 추가하십시오.

NB : 현재 선택된 연결의 데이터베이스와 서버를 가져 오려면 다음 코드 스 니펫을 사용할 수 있습니다.

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는 그것을 수행하는 방법을 다음과 같은 질문 쇼에 답변을 : Linq에와 .NET 4 동적 키워드를 사용의 좋은 예

한 가지 더 예 : DBA가 SQL 쿼리를 제공하고 LinqPad에서 결과를 분석하려고한다고 가정합니다 (물론 SQL이 아닌 Linq). 그런 다음 다음을 수행 할 수 있습니다.

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

이 예에서 DBA의 SELECT 쿼리는 명령 텍스트에 "투입"되고 결과는 City별로 필터링되고 정렬됩니다.
물론 이것은 간단한 예입니다. DBA는 아마도 더 복잡한 스크립트를 제공 할 것이지만 아이디어를 얻습니다. SELECT 절의 모든 필드를 포함하는 지원 결과 클래스를 추가하면 바로 사용할 수 있습니다. .
이런 식으로 저장 프로 시저에서 결과를 가져 와서 Linq에서 사용할 수도 있습니다. 보시다시피이 예제에서는 데이터 형식에 신경 쓰지 않고 dynamic표현하는 데 사용 합니다.
따라서 이것은 데이터를 빠르게 분석 할 수있는 빠른 프로그래밍에 관한 것입니다. 실제 응용 프로그램에서는 여러 가지 이유로이 작업을 수행해서는 안됩니다 (처음부터 EF를 사용할 수 있기 때문에 SQL 삽입).


패널 매니저

LinqPad에서 그래픽 그리기, 1 부

아래의 예를 사용하여 눌러 F4추가합니다 System.Windows.dll, System.Windows.Forms.dll, WindowsFormsIntegration.dll, PresentationCore.dllPresentationFramework.dll당신의 LinqPad 프로그램 또한 네임 스페이스를 추가합니다 System.Windows.Shapes.

번째 예는 단순히 선을 그립니다.

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

번째 예 는 PanelManager를 사용하여 LinqPad에 그래픽을 표시하는 방법을 보여줍니다. 일반적으로 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);
}

그러면 다음 그래픽이 생성됩니다 ( "예제"및 "그림"패널 항목은 위의 예에 의해 추가됨).

표시 _ 그래픽 _in_LinqPad

Northwind 데이터베이스의 이미지표시하려면 다음을 수행
하십시오. 이미지 파일 이름을 "NorthwindPics.jpg"로 변경 한 다음 두 번째 예제의 Main () 메서드 시작 부분에 다음 코드를 추가하십시오 .

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

Employees 테이블에서 첫 번째 레코드를 읽고 그림을 표시합니다.

자세한 내용은 다음 링크를 확인하십시오.
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()여러 번 호출 하면 이미지가 추가됩니다.


윈도우 폼

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 양식을 표시합니다. 추가 참조 (보도를 ) : , , 및 이러한 어셈블리에서 모든 네임 스페이스를 추가합니다.
예
F4
System.Drawing.dllSystem.Windows.Forms.dllSystem.Windows.Forms.DataVisualization.dll


추가 힌트 / 추가 정보 :

  • LinqPad를 Visual Studio 에서 사용하고 싶 습니까? 이를 수행하는 방법은 다음과 같습니다 .

  • LinqPad를 "휴대용 앱" 으로 사용해야 합니까? 그 방법을 여기에서 읽으십시오 .

  • LinqPad 에 대한 Joe의 웹 사이트 는 항상 훌륭한 소스입니다. LinqPad 내부에서는 Help -> What's New새로운 함수 및 메소드에 대한 힌트를 제공합니다. LinqPad 포럼은 또한 유용한 힌트가 포함되어 있습니다.

  • 또한 매우 도움이 : Linq에 (패드) 디버깅에 대한 기사.

  • 배치 스크립트 에서 LINQ 쿼리lprun.exe실행하는 데 사용 합니다 . 자세한 내용은 이 기사 를 읽으십시오 . 예를 들면 다음과 같습니다
    echo Customers.Take(100) > script.txt
    lprun -lang=e -cxname=CompanyServer.CustomerDb script.txt
    .이 예에서 쿼리는 간단한 LINQ 식입니다. 물론 -lang=program프로그램 모드를 활성화 하기 위해 복잡한 쿼리를 준비 할 수도 있습니다 .

  • LinqPad의 왼쪽 에있는 My Queries 탭에 확장 메소드를 작성하여 저장할 수 있습니다 . 트리의 마지막 항목은 My Extensions입니다 . 두 번 클릭하면 모든 쿼리에 사용할 수있는 확장명을 쓸 수있는 파일이 열립니다. 간단히 public static class 에 넣고 확장을위한 테스트를 포함 MyExtensions하는 Main()메소드를 사용하십시오 .


2
Util.ReadLine <string>에 대한 팁을 좋아하십시오 ( "일부 json 입력"); 이전에 파일로 복사 한 다음 거기서 읽었습니다.이 팁이 정말 마음에 듭니다. 감사!
loneshark99

2

Dump는 전역 확장 메서드이며 SubmitChanges는 System.Data.Linq.DataContext 개체 인 DataContext 개체에서 제공됩니다.

LP는 내가 아는 한 덤프 및 분해 만 추가합니다. Reflector에서 열어 다른 것을 사용할 수 있는지 확인하는 것이 좋습니다. 더 흥미로운 점 중 하나는 LINQPad.Util 네임 스페이스로 LINQPad에서 내부적으로 사용하는 기능이 있습니다.


참고 : LinqPad의 최신 버전 : .Dump()소스 편집기에서 또는 다른 방법을 클릭하고 F12 를 눌러 "반영"하십시오. 이제 도구에 내장되었습니다!
매트

1

이전 답변 에서 StackOverflow 텍스트 제한 에 도달 했지만 LinqPad에는 여전히 멋진 확장 기능이 있습니다. 그들 중 하나는 내가 언급하고 싶습니다 :


JavaScript 함수 (사용 .Dump())

LinqPad 5.42 베타 버전부터 JavaScript 함수를 포함시키고 C # 코드에서 직접 호출 할 수 있습니다. 여기에는 JSFiddle과 비교하여 몇 가지 제한 사항이 있지만 LinqPad에서 일부 JavaScript 코드를 빠르게 테스트 할 수있는 좋은 방법입니다.

예:

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하나의 매개 변수가 있는 함수 가 준비되어 variable에 저장됩니다 literal. 그런 다음 .Dump().HtmlElement.InvokeScript(...)매개 변수를 전달하여 via을 통해 렌더링 및 호출됩니다 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");

그것은 같은 효과가 있지만, 더 많은 JavaScript를 할 계획이라면 더 읽기 쉽다;

다른 옵션은 Lambda 표현식을 좋아하고 호출 할 때마다 함수 이름을 문자열로 지정하지 않으려는 경우 다음을 수행 할 수 있습니다.

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. 그러면 jsFooJavaScript 함수 자체와 동일한 이름으로 사용 된 변수 이름 (여기서는 ) 이 해석됩니다 (변수 이름 을 해석하는 데 람다식이 사용되는 방식에 유의하십시오 nameof(paramName). 함수 내부 에서는이를 사용할 수 없습니다 ).


.Dump ()-메시지 인라인 업데이트

오래 실행 된 쿼리를 수행하고 진행률 등을 표시하려는 경우 (예 : 아래 진행률 표시 줄 참조) 새 줄에 넣지 않고 덤프 한 텍스트덮어 쓰는 것이 유용한 경우가 있습니다. 이것은를 사용하여 수행 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 프레임 워크를 사용할 수 있습니다. F4대화 상자에서 LinqPad의 NUGET 지원을 통해 사용할 수 있습니다 Add NUGET..... LinqPad V5 또는 V6과 함께 xUnit사용 하는 방법을 단계별로 설명합니다 .


더 많은 것을 발견하면이 답변을 업데이트 할 것입니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.