Методы LINQPad

У кого-нибудь есть полный список методов и методов расширения LINQPad, таких как

.Dump() SubmitChanges() 

    3 Solutions collect form web for “Методы LINQPad”

    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 есть несколько полезных статических методов. Они задокументированы в автозавершении и include:

    • Cmd – выполняет команду оболочки или внешнюю программу
    • CreateXhtmlWriter – создает текстовый сценарий, в котором используется форматор LINQPad Dump ()
    • SqlOutputWriter – возвращает текстовый редактор, который записывает в окно вывода SQL
    • GetMyQueries , GetSamples – возвращает коллекцию объектов, представляющих ваши сохраненные запросы / образцы (например, выполните поиск с помощью «Изменить | Поиск по всем»)
    • Выделить – обертывает объект так, чтобы он выделялся желтым при сбрасывании
    • HorizontalRun – позволяет вам сбрасывать ряд объектов на одной линии

    LINQPad также предоставляет class 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) были введены новые classы и методы :

    • DumpContainer (class)
    • OnDemand (метод расширения)
    • Util.ProgressBar (class)

    Кроме того, class Hyperlinq теперь поддерживает делегат Action, который будет вызываться при нажатии ссылки, позволяя вам реагировать на него в коде, а не просто ссылаться на внешние веб-страницы.

    DumpContainer – это class, который добавляет блок в окно вывода, которое может заменить его содержимое.

    ЗАМЕТКА! Не забудьте использовать .Dump() сам DumpContainer в соответствующем месте.

    Использовать:

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

    OnDemand – это метод расширения, который не выводит содержимое его параметра в окно вывода, а вместо этого добавляет ссылку с возможностью .Dump() , которая при нажатии будет заменять ссылку на .Dump() ed этого параметра. Это отлично подходит для иногда требуемых структур данных, которые являются дорогостоящими или занимают много места.

    ЗАМЕТКА! Запомните .Dump() результаты вызова OnDemand в соответствующем месте.

    Чтобы использовать его:

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

    Util.ProgressBar – это class, который может отображать графический индикатор прогресса в окне вывода, который может быть изменен по мере продвижения кода.

    ЗАМЕТКА! Не забудьте .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:") , еще одна особенность, которую следует упомянуть, это class Util : он содержит множество довольно удобных методов (некоторые из них я упомянул, но их гораздо больше).

    Также интересно, что вы можете легко изменить способ работы Dump() .

    Наконец, я покажу вам, как вы можете вносить изменения в постоянную (т.е. вставлять, обновлять, удалять запросы LINQ) с помощью SubmitChanges() или SaveChanges() а также как вы можете получить доступ к внутреннему объекту подключения LinqPad.

    И чтобы округлить его, я покажу вам, как вы можете создать простой 2D-графический интерфейс внутри LinqPad (рисование линий, растровых изображений или функций ).

    Итак, вот коллекция встроенных функций LinqPad (по собственному опыту с инструментом):


    .dump ()

    (параметры доступны в LinqPad v5.03.08 и выше)

    Все пользователи LinqPad знают и любят сложный .Dump() расширения .Dump() , который потребляет и печатает (почти) все.

    Но знаете ли вы, что есть пара доступных параметров? Взгляните на этот fragment кода:

     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 

    Первый пример печатает только переменные a и c и скрывает b и d , второй пример делает обратное (обратите внимание, что он указывает только 2 из доступных параметров). Переменные y и z не могут быть скрыты индивидуально, потому что они не находятся на верхнем уровне.

    Доступны следующие параметры ( все они являются необязательными ):

    • description [string] – предоставляет описание объекта для сброса
    • depth [int?] – ограничивает глубину рекурсивно проверяемых объектов
    • toDataGrid [bool] – если true, вывод форматируется как datagrid, а не как RichText
    • exclude [string] – если вы предоставите список переменных, разделенных запятыми, они будут исключены из вывода (в примере показаны «a, c»: b и d , a и c скрыты)
    • exclude [string] с префиксом «+» – префикс инвертирует логику параметра exclude. Это означает, что если вы предоставите список переменных, разделенных запятыми, все, кроме указанных, будут скрыты (в примере «+ b, d»: показаны b и d , все остальные скрыты)
    • хранилище включало и исключало свойства в переменной (новые, начиная с LinqPad V5.09.04):
      var x=Util.ToExpando(obj, "a, c", "b, d"); x.Dump();
      Первая строка содержит список свойств для включения, вторая строка – список для исключения
    • expand on click: Если вы используете .OnDemand("click me").Dump(); вместо .Dump() , он отобразит ссылку, которую вы можете щелкнуть, чтобы развернуть. Полезно, если вы хотите проверить значения, например Util.OnDemand("Customer-ID: " + customerObject.ID.ToString(), ()=>customerObject, false).Dump(); чтобы всегда показывать идентификатор по умолчанию, но раскрывайте детали customerObject только в том случае, если вас интересует.

    Более подробные темы о Дампе можно найти здесь .


    Окружающая среда

    Это не расширение LinqPad, а class .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 для защиты пароля.

    Кроме того, пароль хранится централизованно, поэтому, если вам нужно его изменить, вы можете сделать это в меню, и он немедленно применим ко всем созданным сценариям.

    Заметки:

    • Если вы не хотите сохранять пароль и просто открывать диалоговое окно с паролем, вы можете использовать второй параметр следующим образом:
      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:\"); 

    Это приведет к выводу результата каталога без необходимости. Сохранение его в переменной имеет то преимущество, что вы можете использовать на нем дополнительные запросы 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 указан для подавления вывода консоли, чтобы показать только отфильтрованный результат с использованием метода Дамп.

    Вы можете видеть, что это более гибко, чем подстановочные знаки, которые у вас есть с 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 позволяет отображать индикатор выполнения. Вы можете использовать следующий вспомогательный class:

     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 ("Enter your age"); 

    В качестве синонима Util.ReadLine() вы также можете использовать Console.ReadLine() .

    Но есть еще! Вы можете создать простой парсер JSON со следующим fragmentом – весьма полезно, например, если вы хотите анализировать и тестировать строку JSON на лету. Сохраните следующий fragment как JSONAnalyzer.linq, используя текстовый редактор, а затем откройте его в LinqPad (это означает, что ссылки легко на лету):

      <RuntimeDirectory>\System.Web.Extensions.dll System.Web.Script.Serialization;  void Main() { var jsonData=Util.ReadLine("Enter JSON string:"); var jsonAsObject = new JavaScriptSerializer().Deserialize(jsonData); jsonAsObject.Dump("Deserialized JSON"); } 

    Теперь вы можете запустить его и просто вставить строку JSON из буфера обмена в консоль – он будет использовать функцию Dump чтобы отобразить ее как объект, а также получить сообщения об ошибках синтаксического анализатора на экране для устранения проблем. Очень полезно для отладки AJAX.

    JSON


    Util.ClearResults

    Если вам нужно очистить окно результатов внутри вашего скрипта, используйте:

     Util.ClearResults(); 

    Либо используйте его в начале вашего сценария, либо – если вы выполняете несколько запросов в скрипте, вы должны дождаться ввода пользователя перед тем, как Util.ReadLine экран (например, перед тем, как это сделать с помощью Util.ReadLine ).


    Пользовательский .Dump () – ICustomMemberProvider

    Также интересно, что вы можете влиять на выход метода .Dump() . Просто реализуйте интерфейс ICustomMemberProvider , например

     public class test : ICustomMemberProvider { IEnumerable ICustomMemberProvider.GetNames() { return new List{"Hint", "constMember1", "constMember2", "myprop"}; } IEnumerable ICustomMemberProvider.GetTypes() { return new List{typeof(string), typeof(string[]), typeof(string), typeof(string)}; } IEnumerable ICustomMemberProvider.GetValues() { return new List{ "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 } 

    Если вы создаете экземпляр этого classа, например

     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 (путем ссылки на LINQPad.exe на LINQPad4- LINQPad.exe ). Он выполняет скрипт так же, как это lprun.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 или через 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 , вы можете сделать изменения постоянными (для операций insert / update / delete ). Поскольку контекст базы данных неявно делается 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(); 

    Примечание. Чтобы получить действительные идентификаторы для предыдущих примеров, вы можете использовать:

     var cID = (from c in Categories where c.CategoryName.Contains("Seafood") select c).FirstOrDefault().CategoryID; var pID = Products.Count()+1; 

    прежде чем вы их вызовите.


    SaveChanges () – структура сущностей

    Если вы используете Entity Framework , возможно, вы захотите также сделать изменения постоянными (для операций insert / update / delete ). Поскольку контекст базы данных неявно делается 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(); 

    Примечание. Чтобы получить действительные идентификаторы для предыдущих примеров, вы можете использовать:

     var cID = (from c in Categories where c.CategoryName.Contains("Seafood") select c).FirstOrDefault().CategoryID; var pID = Products.Count()+1; 

    прежде чем вы их вызовите.


    это – контекст базы данных

    В LinqPad контекст базы данных устанавливается автоматически с помощью выпадающего списка вверху и выбора нужной базы данных для вашего запроса. Но иногда полезно ссылаться на него явно, например, если вы скопируете код из своего проекта из Visual Studio и вставьте его в LinqPad.

    Вероятно, ваш fragment кода, взятый из проекта 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 

    в верхней части вашего fragmentа, например:

     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, преобразуя datatable в объект Linq, SQL-запросы в Linq

    Следующий fragment кода поможет вам использовать 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, чтобы запустить этот пример.

    NB: Если вы просто хотите получить базу данных и сервер текущего выбранного соединения, вы можете использовать этот fragment кода:

     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 с Linq

    Еще один пример: предположим, что ваш администратор баз данных дает вам 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(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 просто «брошен в» текст команды, и результаты фильтруются и упорядочиваются по городу.
    Конечно, это упрощенный пример, ваш администратор базы данных, вероятно, поддержит вас более сложным сценарием, но вы получаете идею: просто добавьте поддерживающий class результатов, который содержит все поля из предложения 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.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"); 

    Второй пример показывает, как вы можете отображать графику в 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», затем добавьте следующий код в начале метода 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() несколько раз, и он добавит изображение.


    Windows Forms

    Нарисуйте графику в 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 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 p_fn = null) { if (p_fn == null) p_fn = ((xf) => { return xf; }); // identity as default var xl = new List(); var yl = new List(); 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 как «портативное приложение» ? Читайте здесь, как это сделать.

    • Сайт Joe для LinqPad всегда отличный источник. Внутри LinqPad, Help -> 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: последний элемент дерева называется My Extensions ; дважды щелкните по нему, чтобы открыть файл, в котором вы можете писать расширения, доступные для всех ваших запросов. Просто поместите их в открытый статический class MyExtensions и используйте метод Main() для включения тестов для ваших расширений.

    Дамп – это глобальный метод расширения, а SubmitChanges – это объект DataContext, который является объектом System.Data.Linq.DataContext.

    Насколько мне известно, LP добавляет только Dump и Disassemble. Хотя я бы настоятельно рекомендовал открыть его в Reflector, чтобы узнать, что еще можно использовать. Одним из наиболее интересных вопросов является пространство имен LINQPad.Util, которое имеет некоторые положительные стороны, используемые LINQPad внутри.

    Interesting Posts

    Редактор изображений, который позволяет сохранять множественные, отдельные, одновременные выборки культур? (Ищет бесплатные и платные программы)

    Разрешить стандартным пользователям запускать программу, требующую повышения UAC

    Как установить перечисление в null

    ПИД-код для ноутбука Asus

    Захват видеоэкрана, который поддерживает виртуальный рабочий стол

    android.content.res.Resources $ NotFoundException: Идентификатор ресурса строки # 0x0

    Последняя непустая ячейка (столбец) в данной строке; Excel VBA

    Как я могу использовать getSystemService в classе non-activity (LocationManager)?

    Lazy загружает изображения в gridView

    Скрытые особенности C

    Ошибка 80073701 при установке Windows 7 с пакетом обновления 1

    Как вы повторяете каждый каталог / каталог рекурсивно в стандартном C ++?

    Пользовательская строка числового формата для отображения знака

    Странная проблема с памятью при загрузке изображения в объект Bitmap

    rails – Разработка – Обработка – devise_error_messages

    Давайте будем гением компьютера.