Методы LINQPad [расширение]

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

.Dump()

SubmitChanges()

3 ответов


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

  • Cmd - выполняет команду оболочки или внешнюю программу
  • CreateXhtmlWriter - создает текстовый писатель, который использует форматер Dump() LINQPad
  • SqlOutputWriter - возвращает текст писателя, который пишет для вывода SQL окно
  • GetMyQueries, GetSamples - возвращает коллекцию объектов, представляющих сохраненные запросы / образцы (например, выполнить поиск с помощью Edit | Search All)
  • выделить - обертывает объект так, чтобы он выделялся желтым цветом при сбросе
  • 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 теперь поддерживает действие делегат, который будет вызывается при нажатии на ссылку, что позволяет реагировать на нее в коде, а не только на ссылку на внешние веб-страницы.

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

внимание! не забудьте .Dump() the 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 class: он содержит много довольно удобных методов (некоторые из них я упомянул, но есть намного больше).

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

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

и чтобы округлить его, я покажу вам, как вы можете создать простой 2d графика внутри 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, the Пример 2 совсем наоборот (обратите внимание, что он указывает только 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();
    первая строка содержит список свойств для включения, вторая строка-список для исключения
  • развернуть по щелчку: если вы используете .OnDemand("click me").Dump(); вместо .Dump(), он отобразит ссылку, которую вы можете нажмите, чтобы развернуть. Полезно, если вы хотите проверить значения, например Util.OnDemand("Customer-ID: " + customerObject.ID.ToString(), ()=>customerObject, false).Dump(); всегда показывать идентификатор по умолчанию, но раскрывать детали customerObject только если вы заинтересованы.

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


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

это не расширение LinqPad, а скорее класс .NET, но поскольку это полезно, я все равно упомяну об этом. Вы можете получить много полезной информации вы можете использовать в ваших скриптах, таких как:

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

Б. Н. для получения Domain\UserName я хотел бы использовать System.Security.Principal.WindowsIdentity.GetCurrent().Name
а не Environment.UserDomainName+@"\"+Environment.UserName.


Util.WriteCsv

( new: доступен, начиная с 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, вы можете использовать эту вспомогательную функцию (n.b.: чтобы получить метод расширения .ToSecureString() используется, пожалуйста эта ссылка на Stackoverflow - он также позволяет конвертировать его обратно, если это необходимо):
    System.Security.SecureString GetPasswordSecure(string Name, bool noDefaultSave=true)
    {
      return Util.GetPassword(Name, noDefaultSave).ToSecureString();
    }


Util.Cmd

этот метод работает как командный процессор. Вы можете вызвать все команды, которые вы знаете из Консоль Windows.

Пример 1 - реж:

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. The /s switch используется для рекурсии всех подкаталогов и /b используется для голые выходной формат. Обратите внимание, что второй параметр метода Cmd указан для подавления вывода консоли, чтобы показать только отфильтрованный результат с помощью метода Dump.

вы можете видеть, что это более гибкий, чем подстановочные знаки у вас есть с dir поскольку вы можете использовать полную гибкость механизма запросов Linq.

Пример 2 - текстовый редактор:

вы можете открыть файл в блокноте, как это:

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

Util.Изображение

отображает изображения из 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.Прогресс!--170-->

используя 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 функция для отображения его как объекта красиво - и вы также получаете сообщения об ошибках парсера на экране, чтобы исправить проблемы. Очень полезно для отладки AJAX.

JSON


Util.ClearResults

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

Util.ClearResults();

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


Custom .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 dump


отображение MessageBox или InputBox в LinqPad

Если вам нужно отобразить messagebox, посмотрите здесь как это сделать.

например, вы можете отобразить 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.Запустить

( new: доступен, начиная с 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");
}

это позволяет различать, был ли скрипт запущен из GUI 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, вы можете сделать изменения постоянными (для вставить/обновить/удалить операции). Поскольку контекст базы данных неявно создается LinqPad, вам нужно вызвать SubmitChanges() после каждого изменения, как показано ниже.

примеры (Помощью Linqpad -) "Борей" база данных:

вставить

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

если вы используете сущность Рамки, вы можете сделать изменения постоянными, а также (для вставить/обновить/удалить операции). Поскольку контекст базы данных неявно создается 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, the как вы можете сделать это.

  • необходимо иметь LinqPad в качестве "портативное приложение"? читать здесь как это сделать.

  • Джо помощью linqpad - это всегда отличный источник. Внутри LinqPad,Help -> What's New дает вам подсказки о новых функциях и методах. The Форум LinqPad также содержит полезные советы.
  • также очень полезно: этой статья о Linq(Pad) отладка.

  • использовать lprun.exe на выполнение запросов LINQ в своем batch-скрипты. читать в этой статье для получения более подробной информации. Например:
    echo Customers.Take(100) > script.txt
    lprun -lang=e -cxname=CompanyServer.CustomerDb script.txt
    В этом примере запрос представляет собой простое выражение LINQ. Конечно, вы также можете подготовить сложные запросы, используя -lang=program для активации режима программы.

  • вы можете напишите свои собственные методы расширения и сохраните их в Мои Запросы вкладка в левой части LinqPad: последний элемент дерева называется Мои Расширения; дважды щелкните по нему, чтобы открыть файл, где вы можете написать расширения, доступные для всех ваших запросов. Просто поместите их в открытый статический класс MyExtensions, и использовать Main() метод для включения тестов для ваших расширений.


  • Dump является глобальным методом расширения, а SubmitChanges поступает из объекта DataContext, который является системой.Данные.В LINQ.Объект DataContext.

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