누구든지 다음과 같은 LINQPad 확장 방법 및 방법의 전체 목록을 가지고 있습니까?
.Dump()
SubmitChanges()
답변
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);
}
답변
잘 알려진 것 외에도 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 예제 인쇄 전용 변수 a
와 c
와 가죽 b
과 d
의 두번째 예는 반대 (이 지정하는 주 사용 가능한 매개 변수의 2)를 수행합니다. 변수 y
와는 z
그들이 최상위에 있지 않기 때문에, 개별적으로 숨길 수 없습니다.
다음 매개 변수를 사용할 수 있습니다 ( 모두 선택 사항 임 ).
description
[문자열]-덤프 할 객체에 대한 설명을 제공합니다.depth
[int?]-객체의 재귀 검사 깊이를 제한합니다toDataGrid
[bool]-true 인 경우 출력은 RichText가 아닌 데이터 그리드로 형식화됩니다.exclude
[문자열] -는 변수의 쉼표로 구분 된 목록을 제공하는 경우, 이들은 출력에서 제외한다 ( “A, C ‘의 예에서b
와d
도시되고,a
및c
숨겨진)exclude
접두사가 “+”인 [문자열]-접두사는 제외 매개 변수의 논리를 반전시킵니다. 이 수단을 사용하면, 숨겨진 지정된 제외한 모든 변수 쉼표로 구분 된 목록을 제공하는 경우 (이 예에서는 “+ 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
Linqpad의 결과 창에서 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 메소드를 사용하여 필터링 된 결과 만 표시하기 위해 콘솔 출력을 억제하도록 지정됩니다.
dir
Linq 쿼리 엔진의 전체 유연성을 사용할 수 있으므로 이것이 와일드 카드보다 더 유연하다는 것을 알 수 있습니다.
예 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.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이 어떤 종류의 일을하지 않는 (특히, 당신은 같은 포트 이름을 통과해야하는 경우 : 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><RuntimeDirectory>\System.Web.Extensions.dll</Reference>
<Namespace>System.Web.Script.Serialization</Namespace>
</Query>
void Main()
{
var jsonData=Util.ReadLine<string>("Enter JSON string:");
var jsonAsObject = new JavaScriptSerializer().Deserialize<object>(jsonData);
jsonAsObject.Dump("Deserialized JSON");
}
이제이를 실행하고 클립 보드에서 JSON 문자열을 콘솔에 간단히 붙여 넣을 수 있습니다.이 Dump
기능을 사용하여 객체로 멋지게 표시 할 수 있습니다. 또한 화면에 파서의 오류 메시지가 표시되어 문제를 해결합니다. AJAX 디버깅에 매우 유용합니다.
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에 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.dll
및 PresentationFramework.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);
}
그러면 다음 그래픽이 생성됩니다 ( “예제”및 “그림”패널 항목은 위의 예에 의해 추가됨).
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.dll
System.Windows.Forms.dll
System.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()
메소드를 사용하십시오 .
답변
Dump는 전역 확장 메서드이며 SubmitChanges는 System.Data.Linq.DataContext 개체 인 DataContext 개체에서 제공됩니다.
LP는 내가 아는 한 덤프 및 분해 만 추가합니다. Reflector에서 열어 다른 것을 사용할 수 있는지 확인하는 것이 좋습니다. 더 흥미로운 점 중 하나는 LINQPad.Util 네임 스페이스로 LINQPad에서 내부적으로 사용하는 기능이 있습니다.
답변
이전 답변 에서 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
. 그러면 jsFoo
JavaScript 함수 자체와 동일한 이름으로 사용 된 변수 이름 (여기서는 ) 이 해석됩니다 (변수 이름 을 해석하는 데 람다식이 사용되는 방식에 유의하십시오 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.";
}
참고 좀 더 복잡한 객체를 들어, 사용 할 수 있다는 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 을 사용 하는 방법을 단계별로 설명합니다
.
더 많은 것을 발견하면이 답변을 업데이트 할 것입니다