Alguém tem uma lista completa dos métodos e métodos de extensão LINQPad, como
.Dump()
SubmitChanges()
c#
.net
entity-framework
linq-to-sql
linqpad
Bent Rasmussen
fonte
fonte
Respostas:
O LINQPad define dois métodos de extensão (em LINQPad.Extensions), a saber,
Dump()
eDisassemble()
.Dump()
grava na janela de saída usando o formatador de saída do LINQPad e é sobrecarregado para permitir que você especifique um cabeçalho:Você também pode especificar uma profundidade máxima de recursão para substituir o padrão de 5 níveis:
Desmontar () desmonta qualquer método para
IL
, retornando a saída em uma string:Além desses dois métodos de extensão, existem alguns métodos estáticos úteis no LINQPad.Util. Eles estão documentados no preenchimento automático e incluem:
O LINQPad também fornece a classe HyperLinq. Isso tem dois propósitos: o primeiro é exibir hiperlinks comuns:
Você pode combinar isso com
Util.HorizontalRun
:Resultado:
O segundo objetivo do HyperLinq é criar consultas dinamicamente:
Você também pode escrever seus próprios métodos de extensão no LINQPad. Vá para 'Minhas consultas' e clique na consulta chamada 'Minhas extensões'. Quaisquer tipos / métodos que definem aqui são acessíveis a todas as consultas:
Em 4.46 (.02), novas classes e métodos foram introduzidos :
Além disso, a classe Hyperlinq agora suporta um delegado Action que será chamado quando você clicar no link, permitindo que você reaja a ele no código e não apenas vincule a páginas da Web externas.
DumpContainer
é uma classe que adiciona um bloco à janela de saída que pode ter seu conteúdo substituído.NOTA! Lembre-se
.Dump()
aDumpContainer
si mesma no local apropriado.Usar:
OnDemand
é um método de extensão que não gera o conteúdo de seu parâmetro na janela de saída, mas adiciona um link clicável que, quando clicado, substitui o link pelo.Dump()
conteúdo ed do parâmetro. Isso é ótimo para estruturas de dados às vezes necessárias que são caras ou ocupam muito espaço.NOTA! Lembre-se
.Dump()
dos resultados da chamadaOnDemand
no local apropriado.Para usá-lo:
Util.ProgressBar
é uma classe que pode mostrar uma barra de progresso gráfica dentro da janela de saída, que pode ser alterada à medida que o código avança.NOTA! Lembre-se
.Dump()
do objeto Util.ProgressBar no local apropriado.Para usá-lo:
fonte
Além do conhecido
myQuery.Dump("Query result:")
, outro recurso a ser mencionado é oUtil
classe: contém muitos métodos bastante úteis (alguns deles que eu mencionei, mas existem muito mais).Também interessante é que você pode modificar a maneira como
Dump()
funciona .Por fim, mostrarei como você pode tornar as alterações permanentes (ou seja , inserir, atualizar, excluir consultas LINQ) usando
SubmitChanges()
ouSaveChanges()
como também pode acessar o objeto de conexão interna do LinqPad.E para finalizar , mostrarei como você pode criar gráficos 2D simples dentro do LinqPad ( linhas de desenho , bitmaps ou funções ).
Então, aqui está uma coleção de recursos internos do LinqPad (a partir de minha própria experiência com a ferramenta):
.Dump ()
(parâmetros disponíveis no LinqPad v5.03.08 e superior)
Todos os usuários do LinqPad conhecem e amam o
.Dump()
método de extensão, que consome e imprime (quase) tudo.Mas você sabia que existem alguns parâmetros disponíveis? Dê uma olhada neste snippet de código:
Os primeiro exemplo imprime apenas variáveis
a
ec
e escondeb
ed
, o segundo exemplo faz o contrário (nota que especifica apenas 2 dos parâmetros disponíveis). As variáveisy
ez
não podem ser ocultadas individualmente, porque não estão no nível superior.Os seguintes parâmetros estão disponíveis ( todos são opcionais ):
description
[string] - fornece uma descrição para o objeto despejardepth
[int?] - limita a profundidade da inspeção recursiva dos objetostoDataGrid
[bool] - se true, a saída é formatada como um datagrid e não como RichTextexclude
[string] - se você fornecer uma lista de variáveis separadas por vírgula, elas serão excluídas da saída (no exemplo "a, c":b
ed
são mostradasa
ec
estão escondidos)exclude
[string] com prefixo "+" - o prefixo inverte a lógica do parâmetro de exclusão. Isso significa que, se você fornecer uma lista de variáveis separadas por vírgula, todas, exceto as especificadas, serão ocultadas (no exemplo "+ b, d":b
ed
serão exibidas, todas as outras ocultas)var x=Util.ToExpando(obj, "a, c", "b, d"); x.Dump();
a primeira string contém uma lista de propriedades a serem incluídas, a segunda string uma lista a ser excluída
.OnDemand("click me").Dump();
vez de.Dump()
, ele exibirá um link no qual você pode clicar para expandir. Útil se você deseja inspecionar valores, por exemplo,Util.OnDemand("Customer-ID: " + customerObject.ID.ToString(), ()=>customerObject, false).Dump();
sempre mostrar o ID por padrão, mas revelar os detalhescustomerObject
apenas se estiver interessado.Tópicos mais avançados sobre o Dump podem ser encontrados aqui e ali .
Meio Ambiente
Esta não é uma extensão do LinqPad, mas sim uma classe .NET, mas como é útil, mencionarei de qualquer maneira. Você pode obter muitas informações úteis que podem ser usadas em seus scripts, como:
NB Para obter,
Domain\UserName
eu usaria emSystem.Security.Principal.WindowsIdentity.GetCurrent().Name
vez de
Environment.UserDomainName+@"\"+Environment.UserName
.Util.WriteCsv
( novo: disponível desde a versão LinqPad v4.45.05 (beta) )
Isso gravará o conteúdo da tabela
Customers
no arquivo CSVc:\temp\customers.csv
. Você também pode encontrar um bom exemplo de como usarUtil.WriteCsv
e exibir os dados CSV na janela de resultados do Linqpad aqui .Dicas:
Para obter / criar um arquivo CSV que esteja no mesmo diretório da consulta, você pode usar:
var csvFile=Util.CurrentQueryPath.Replace(".linq", ".csv");
Se a tabela for grande, use
ObjectTrackingEnabled = false;
antes de gravar o CSV para evitar armazená-lo na memória.Se você deseja gerar uma tabela no formato XML, e não como arquivo separado por vírgula, é possível:
Este exemplo retorna todos os elementos com o atributo
attr1
que contém o valor"a"
de um arquivo XML que tem o mesmo nome que a consulta e está contido no mesmo caminho. Confira este link para mais exemplos de código.Util.GetPassword
Isso recuperará a senha do gerenciador de senhas incorporado do LinqPad. Para criar e alterar a senha, abra o item de menu "Password Manager" no menu "File" de LinqPad. Se não houver senha salva ao executar o código C #, uma caixa de diálogo será exibida, solicitando a senha e você poderá criar e salvá-la em tempo real, marcando a caixa de seleção Salvar senha (no exemplo, a senha para "UserXY" seria salvo e, posteriormente, você poderá encontrar esta entrada no gerenciador de senhas ).
As vantagens são que você pode armazenar a senha nos LinqScripts criados com segurança, separadamente e criptografados no perfil de usuário do Windows (ele é armazenado em
%localappdata%\LINQPad\Passwords
como um arquivo). O LinqPad usa o Windows DPAPI para proteger a senha.Além disso, a senha é armazenada centralmente; portanto, se você precisar alterá-la, poderá fazê-lo no menu e aplicar imediatamente a todos os scripts que você criou.
Notas:
Se você não quiser salvar a senha e apenas abrir um diálogo de senha, poderá usar o segundo parâmetro da seguinte maneira:
var pwd = Util.GetPassword("UserXY", true);
Isso desmarcará a caixa de seleção Salvar senha na caixa de diálogo de senha (no entanto, o usuário ainda poderá verificá-la e escolha salvar de qualquer maneira).
Se você precisar que a senha seja armazenada em a
SecureString
, poderá usar esta função auxiliar (nb: para obter o método de extensão.ToSecureString()
usado, siga este link em Stackoverflow - ele também permite que você a converta novamente, se necessário):System.Security.SecureString GetPasswordSecure(string Name, bool noDefaultSave=true)
{
return Util.GetPassword(Name, noDefaultSave)
.ToSecureString();
}
Util.Cmd
Este método funciona como um processador de comandos. Você pode chamar todos os comandos que você conhece no console do Windows.
Exemplo 1 - dir:
Isso produzirá o resultado do diretório sem a necessidade
.Dump
dele. Armazená-lo em uma variável tem a vantagem de poder usar outras consultas do Linq. Por exemplo:Isso irá despejar todos os arquivos com extensões de arquivo ".exe" ou ".dll" contidas em
C:\windows\system32
. A/s
opção é usada para repetir todos os subdiretórios e/b
é usado para o formato de saída bare. Observe que o segundo parâmetro do método Cmd é especificado para suprimir a saída do console para mostrar apenas o resultado filtrado usando o método Dump.Você pode ver que isso é mais flexível do que os caracteres curinga que você possui,
dir
pois pode usar toda a flexibilidade do mecanismo de consulta do Linq.Exemplo 2 - editor de texto:
Você pode abrir um arquivo no bloco de notas assim:
Util.Image
Exibe imagens de um URL. Exemplo:
Util.ProgressBar, Util.Progress
Usar
Util.ProgressBar
permite exibir uma barra de progresso. Você pode usar a seguinte classe auxiliar:Basta usá-lo como o exemplo a seguir mostra:
Como alternativa, você pode usar
Util.Progress
para atualizar a barra de progresso integrada do LinqPads, por exemplo:A diferença é que ela não será exibida na janela de resultados e você não poderá atribuir uma mensagem a ela.
Util.RawHtml
Exibe HTML na janela de saída. Exemplo:
Hyperlinq, Util.HorizontalRun
Você pode usar esta função de exemplo
para mostrar hiperlinks na janela de resultados - ou qualquer ação como abrir seu editor favorito. Uso:
Observe que essa função sempre funciona, embora
new Hyperlinq ("http://myURL", "Web site").Dump();
não funcione para alguns tipos de URLs (especialmente se você precisar passar nomes de portas como ": 1234" como parte da URL).Util.ReadLine
Lê a entrada do console. Exemplo:
Como sinônimo
Util.ReadLine<string>()
, você também pode usarConsole.ReadLine()
.Mas tem mais! É possível criar um analisador JSON simples com o seguinte trecho - bastante útil, por exemplo, se você deseja analisar e testar uma sequência JSON em tempo real. Salve o seguinte snippet como JSONAnalyzer.linq usando um editor de texto e abra-o no LinqPad (isto é para adicionar as referências facilmente em tempo real):
Agora você pode executá-lo e simplesmente colar uma string JSON da área de transferência no console - ela usará a
Dump
função para exibi-la como um objeto bem - e você também receberá as mensagens de erro do analisador na tela para corrigir problemas. Muito útil para depurar AJAX.Util.ClearResults
Se você precisar limpar a janela de resultados dentro do seu script, use:
Use-o na parte superior do seu script ou - se você estiver executando várias consultas em um script - deverá aguardar a entrada do usuário antes de apagar a tela (por exemplo, precedendo-a
Util.ReadLine
).Custom .Dump () - ICustomMemberProvider
Também interessante é que você pode alterar a saída do
.Dump()
método. Simplesmente implemente a interfaceICustomMemberProvider
, por exemploSe você criar uma instância dessa classe, como
em seguida, ele irá imprimir única
Hint
,constMember1
,constMember2
, emyprop
, mas não propriedadexyz
:Exibindo um MessageBox ou InputBox no LinqPad
Se você precisar exibir uma caixa de mensagens, veja aqui como fazê-lo.
Por exemplo, você pode exibir um InputBox usando o seguinte código
(não esqueça de pressionar F4 e adicionar Microsoft.VisualBasic.dll e seus espaços para nome para fazer isso funcionar)
Util.Run
( novo: disponível desde a versão LinqPad v4.52.1 (beta) )
Permite executar outro script LINQPad de dentro do seu script ou dentro do seu próprio programa .NET ou serviço do Windows (referenciando a versão do LINQPad4-AnyCPU do
LINQPad.exe
). Ele executa o script exatamente como a ferramenta de linha de comandolprun.exe
faria.Exemplos:
Este exemplo executa o script
foo.linq
, que contém o seguinte código de exemplo:Ele permite que você verifique se o script foi executado de dentro da GUI do LinqPad ou via
lprun.exe
ou comUtil.Run
.Nota: As seguintes variantes de chamada podem ser úteis:
SubmitChanges () - Linq para SQL
Se você estiver usando o LinqToSQL , poderá tornar as alterações permanentes (para operações de inserção / atualização / exclusão ). Como o contexto do banco de dados é implicitamente criado pelo LinqPad, é necessário chamar
SubmitChanges()
após cada alteração, como mostrado abaixo.Exemplos para o banco de dados (LinqPad-) Northwind :
Inserir
Atualizar
Excluir
Nota: Para obter IDs válidos para os exemplos anteriores, você pode usar:
antes de invocá-los.
SaveChanges () - Estrutura da entidade
Se você estiver usando o Entity Framework , também poderá tornar as alterações permanentes (para operações de inserção / atualização / exclusão ). Como o contexto do banco de dados é implicitamente criado pelo LinqPad, é necessário chamar
SaveChanges()
após cada alteração, como mostrado abaixo.Os exemplos são basicamente os mesmos de antes para o LinqToSQL , mas você precisa usá-lo
SaveChanges()
e, para inserir e excluir, os métodos também foram alterados.Inserir
Atualizar
Excluir
Nota: Para obter IDs válidos para os exemplos anteriores, você pode usar:
antes de invocá-los.
this - contexto do banco de dados
No LinqPad , o contexto do banco de dados é aplicado automaticamente usando a caixa de combinação na parte superior e escolhendo o banco de dados correto para sua consulta. Mas, às vezes, é útil referenciá-lo explicitamente, por exemplo, se você copiar algum código do seu projeto fora do Visual Studio e colá-lo no LinqPad.
Seu snippet de código retirado do projeto Visual Studio provavelmente se parece com isso:
Agora o que fazer com
dc
? Obviamente, você pode remover cada ocorrência dedc.
sua consulta, mas é muito mais fácil. Basta adicionarpara o topo do seu snippet da seguinte forma:
e o código funcionará instantaneamente!
this.Connection
Usando o LinqPad com OleDb, convertendo uma tabela de dados em um objeto Linq, as consultas SQL no Linq
O seguinte trecho de código ajuda você a usar o LinqPad com o OleDb. Adicione
System.Data.OleDb
doSystem.Data
assembly às propriedades da consulta e cole o seguinte código emMain()
:Agora adicione uma conexão SqlServer ao LinqPad e adicione o banco de dados Northwind para executar este exemplo.
NB: Se você deseja apenas obter o banco de dados e o servidor da conexão atualmente selecionada, pode usar este trecho de código:
Você pode até converter
myDS
para o Linq, as respostas para a seguinte pergunta mostram como fazê-lo: Bons exemplos de como usar a palavra-chave dinâmica do .NET 4 com o LinqMais um exemplo: suponha que o seu DBA fornece uma consulta SQL e você deseja analisar os resultados no LinqPad - é claro no Linq, não no SQL. Então você pode fazer o seguinte:
Neste exemplo, a consulta SELECT do DBA é apenas "lançada" no texto do comando, e os resultados são filtrados e ordenados por Cidade.
Obviamente, este é um exemplo simplificado, seu DBA provavelmente forneceria um script mais complexo, mas você está entendendo: Apenas adicione uma classe de resultado de suporte que contenha todos os campos da cláusula SELECT e você poderá usá-la diretamente .
Você pode até pegar o resultado de um procedimento armazenado dessa maneira e usá-lo no Linq. Como você pode ver, neste exemplo, não me importo com o tipo de dados e o uso
dynamic
para expressá-lo.Portanto, trata-se realmente de programação rápida para poder analisar dados rapidamente. Você não deve fazer isso em sua aplicação real por vários motivos (injeção de SQL, porque você pode usar EF desde o início, etc.).
PanelManager
Desenhar gráfico no LinqPad, parte 1
Para usar os exemplos a seguir, pressione F4e adicione
System.Windows.dll
,System.Windows.Forms.dll
,WindowsFormsIntegration.dll
,PresentationCore.dll
ePresentationFramework.dll
para o seu programa LinqPad e também adicionar o namespaceSystem.Windows.Shapes
.O primeiro exemplo simplesmente desenha uma linha:
O segundo exemplo mostra como você pode exibir gráficos no LinqPad usando o PanelManager. Normalmente, o LinqPad suporta apenas objetos Wpf. Este exemplo usa
System.Windows.Forms.Integration.WindowsFormsHost
paraWindows.Forms.PictureBox
disponibilizar (foi inspirado por isso ):Isso criará o seguinte gráfico (os itens do painel "Gráfico" e "Imagem" são adicionados pelos exemplos acima):
Se você deseja exibir as imagens do banco de dados Northwind, faça o seguinte:
Altere o nome do arquivo de imagem para "NorthwindPics.jpg" e adicione o seguinte código no início do método Main () do segundo exemplo :
Ele lerá o primeiro registro da tabela Funcionários e exibirá a figura.
Confira os links a seguir para saber mais:
Formas e desenho básico nos visualizadores personalizados do WPF
LinqPad
Nota: Você pode conseguir o mesmo sem o PanelManager, como mostra o exemplo a seguir, que vi aqui :
Está usando o
.Dump()
comando para exibi-lo. Você pode chamarimage.Dump()
várias vezes e ele acrescentará a imagem.Windows Forms
Desenhar gráfico no LinqPad, parte 2
O exemplo a seguir, inspirado nesta publicação, mostra como implementar uma plotadora de funções simples no Linqpad 5 usando C # 7:
Ele está usando o recurso do LinqPad para exibir formulários do Windows no painel de resultados. Adicionar referências (imprensa ) : , , e adicionar todos os namespaces a partir destas assembléias.
F4
System.Drawing.dll
System.Windows.Forms.dll
System.Windows.Forms.DataVisualization.dll
Dicas adicionais / leitura adicional:
Deseja usar o LinqPad no Visual Studio ? Veja como você pode fazer isso .
Precisa ter o LinqPad como um "aplicativo portátil" ? Leia aqui como fazer isso.
O site de Joe para o LinqPad é sempre uma excelente fonte. Dentro do LinqPad,
Help -> What's New
você fornece dicas sobre novas funções e métodos. O Fórum LinqPad também contém dicas úteis.Também muito útil: este artigo sobre depuração do Linq (Pad).
Use
lprun.exe
para executar consultas LINQ em seus scripts em lote. Leia este artigo para mais detalhes. Por exemplo:echo Customers.Take(100) > script.txt
lprun -lang=e -cxname=CompanyServer.CustomerDb script.txt
Neste exemplo, a consulta é uma expressão LINQ simples. Obviamente, você também pode preparar consultas complexas usando
-lang=program
para ativar o modo de programa.Você pode escrever métodos de extensão e armazená-los na guia Minhas consultas, no lado esquerdo do LinqPad: O último item da árvore é chamado Minhas extensões ; clique duas vezes nele para abrir um arquivo onde é possível gravar extensões disponíveis para todas as suas consultas. Basta colocá-los na classe estática pública
MyExtensions
e usar oMain()
método para incluir testes para suas extensões.fonte
O dump é um método de extensão global e o SubmitChanges vem do objeto DataContext, que é um objeto System.Data.Linq.DataContext.
LP adiciona apenas despejar e desmontar, tanto quanto eu sei. Embora eu recomendo abri-lo no Reflector para ver o que mais pode ser usado. Uma das coisas mais interessantes é o namespace LINQPad.Util, que possui alguns itens usados internamente pelo LINQPad.
fonte
.Dump()
ou em qualquer outro método no editor de código-fonte, pressione F12 para "refletir". Agora isso está embutido na ferramenta!Atingi o limite de texto StackOverflow na minha resposta anterior , mas ainda existem mais extensões interessantes no LinqPad. Um deles eu gostaria de mencionar:
Funções JavaScript (usando
.Dump()
)Desde a versão 5.42 beta do LinqPad, você pode incorporar funções JavaScript e chamá-las diretamente do seu código C #. Embora isso tenha algumas limitações (em comparação com o JSFiddle), é uma boa maneira de testar rapidamente algum código JavaScript no LinqPad.
Exemplo:
Neste exemplo, uma função
jsFoo
de um parâmetro é preparado e armazenado na variávelliteral
. Então, ele é processado e chamado via.Dump().HtmlElement.InvokeScript(...)
, passando o parâmetrotestparam
.A função JavaScript usa
external.Log(...)
para gerar texto nas janelas de saída do LinqPad ealert(...)
exibir uma mensagem pop-up.Você pode simplificar isso adicionando os seguintes métodos / classe de extensão:
Em seguida, você pode chamar o exemplo anterior da seguinte maneira:
Isso tem o mesmo efeito, mas é mais fácil de ler (se você pretende fazer mais JavaScript ;-)).
Outra opção, se você gosta de expressões Lambda e não gosta de especificar o nome da função como string sempre que a chama, é possível:
desde que você tenha adicionado a função auxiliar
para a classe
ScriptExtension
. Isso resolverá o nome da variável que você usou (aquijsFoo
), que passa a ser o mesmo nome da própria função JavaScript (observe como a expressão lambda é usada para resolver o nome da variável, isso não pode ser feito usandonameof(paramName)
dentro da função)..Dump () - atualizando uma mensagem em linha
Às vezes, é útil sobrescrever o texto que você despejou em vez de colocá-lo em uma nova linha, por exemplo, se você estiver executando uma consulta de longa execução e quiser mostrar seu progresso, etc (consulte também ProgressBar abaixo). Isso pode ser feito usando a
DumpContainer
, você pode usá-lo como mostrado naExemplo 1:
Observe que, para alguns objetos mais complexos, você pode ter que usar em
dc.UpdateContent(obj);
vez dedc.Content=...
.Exemplo 2:
Util.ProgressBar
Mostrar o progresso também pode ser feito usando uma ProgressBar da seguinte maneira:
Exemplo:
Isso é semelhante ao exemplo de despejo anterior, mas desta vez mostrando uma boa animação da barra de progresso.
Teste de unidade com LinqPad - xUnit
Você sabia que pode escrever testes de unidade no LinqPad? Por exemplo, você pode usar a estrutura xUnit. Está disponível através do suporte NUGET do LinqPad - via F4- no clique da caixa de diálogo Add NUGET..... Aqui está uma descrição passo a passo de como usar o xUnit com o LinqPad V5 ou V6.
Se descobrir mais, atualizarei esta resposta
fonte