¿Alguien tiene una lista completa de métodos y métodos de extensión LINQPad, como
.Dump()
SubmitChanges()
c#
.net
entity-framework
linq-to-sql
linqpad
Bent Rasmussen
fuente
fuente
Respuestas:
LINQPad define dos métodos de extensión (en LINQPad.Extensions), a saber,
Dump()
yDisassemble()
.Dump()
escribe en la ventana de salida utilizando el formateador de salida de LINQPad y se sobrecarga para permitirle especificar un encabezado:También puede especificar una profundidad de recursión máxima para anular el valor predeterminado de 5 niveles:
Disassemble () desensambla cualquier método y
IL
devuelve el resultado en una cadena:Además de esos dos métodos de extensión, hay algunos métodos estáticos útiles en LINQPad.Util. Estos están documentados en autocompletado e incluyen:
LINQPad también proporciona la clase HyperLinq. Esto tiene dos propósitos: el primero es mostrar hipervínculos ordinarios:
Puedes combinar esto con
Util.HorizontalRun
:Resultado:
El segundo propósito de HyperLinq es generar consultas dinámicamente:
También puede escribir sus propios métodos de extensión en LINQPad. Vaya a 'Mis consultas' y haga clic en la consulta llamada 'Mis extensiones'. Todos los tipos / métodos que definen aquí son accesibles para todas las consultas:
En 4.46 (.02) se han introducido nuevas clases y métodos :
Además, la clase Hyperlinq ahora admite un delegado de Action que se llamará cuando haga clic en el enlace, lo que le permite reaccionar a él en el código y no solo vincular a páginas web externas.
DumpContainer
es una clase que agrega un bloque en la ventana de salida que puede reemplazar su contenido.¡NOTA! Recuerde
.Dump()
laDumpContainer
misma en el lugar apropiado.Usar:
OnDemand
es un método de extensión que no generará el contenido de su parámetro en la ventana de salida, sino que agregará un enlace en el que se puede hacer clic, que al hacer clic reemplazará el enlace con el.Dump()
contenido ed del parámetro. Esto es ideal para estructuras de datos que a veces se necesitan, que son costosas o ocupan mucho espacio.¡NOTA! Recuerde
.Dump()
los resultados de llamarOnDemand
en el lugar apropiado.Para usarlo:
Util.ProgressBar
es una clase que puede mostrar una barra de progreso gráfica dentro de la ventana de salida, que se puede cambiar a medida que avanza el código.¡NOTA! Recuerde
.Dump()
el objeto Util.ProgressBar en el lugar apropiado.Para usarlo:
fuente
Además del conocido
myQuery.Dump("Query result:")
, otra característica a mencionar es laUtil
clase: contiene muchos métodos bastante útiles (algunos de los cuales he mencionado, pero hay muchos más).También es interesante que pueda modificar la forma en que
Dump()
funciona .Finalmente te mostraré cómo puedes hacer cambios permanentes (es decir , insertar, actualizar, eliminar consultas LINQ) usando
SubmitChanges()
oSaveChanges()
cómo puede acceder al objeto de conexión interna de LinqPad.Y para resumir, te mostraré cómo puedes crear simples gráficos 2D dentro de LinqPad (dibujar líneas, mapas de bits o funciones ).
Entonces, aquí hay una colección de características integradas de LinqPad (desde mi propia experiencia con la herramienta):
.Tugurio()
(parámetros disponibles en LinqPad v5.03.08 y superior)
Todos los usuarios de LinqPad conocen y aman el
.Dump()
método de extensión, que consume e imprime (casi) todo.¿Pero sabías que hay un par de parámetros disponibles? Eche un vistazo a este fragmento de código:
Los primero ejemplos de impresiones únicas variables
a
yc
y cuerosb
yd
, el segundo ejemplo hace lo contrario (nota que especifica sólo 2 de los parámetros disponibles). Las variablesy
yz
no se pueden ocultar individualmente, porque no están en el nivel superior.Los siguientes parámetros están disponibles ( todos son opcionales ):
description
[cadena]: proporciona una descripción del objeto para volcardepth
[int?]: limita la profundidad de los objetos que se inspeccionan recursivamentetoDataGrid
[bool]: si es verdadero, el resultado se formatea como una cuadrícula de datos en lugar de como RichTextexclude
[cadena]: si proporciona una lista de variables separadas por comas, se excluirán de la salida (en el ejemplo "a, c":b
yd
se muestrana
yc
se ocultan)exclude
[cadena] con el prefijo "+": el prefijo invierte la lógica del parámetro de exclusión. Esto significa que si proporciona una lista de variables separadas por comas, todas excepto las especificadas están ocultas (en el ejemplo "+ b, d":b
yd
se muestran, todas las demás están ocultas)var x=Util.ToExpando(obj, "a, c", "b, d"); x.Dump();
la primera cadena contiene una lista de propiedades para incluir, la segunda cadena una lista para excluir
.OnDemand("click me").Dump();
lugar de.Dump()
, mostrará un enlace en el que puede hacer clic para expandir. Útil si desea inspeccionar valores, por ejemplo,Util.OnDemand("Customer-ID: " + customerObject.ID.ToString(), ()=>customerObject, false).Dump();
para mostrar siempre la ID por defecto pero revelar los detallescustomerObject
solo si está interesado.Se pueden encontrar temas más avanzados sobre Dump aquí y allá .
Ambiente
Esta no es una extensión de LinqPad, sino una clase .NET, pero como es útil, lo mencionaré de todos modos. Puede obtener mucha información útil que puede usar en sus scripts, como:
Nota: Para obtener
Domain\UserName
lo usaríaSystem.Security.Principal.WindowsIdentity.GetCurrent().Name
en lugar de
Environment.UserDomainName+@"\"+Environment.UserName
.Util.WriteCsv
( nuevo: disponible desde la versión de LinqPad v4.45.05 (beta) )
Esto escribirá el contenido de la tabla
Customers
en el archivo CSVc:\temp\customers.csv
. También puede encontrar un buen ejemplo de cómo usarUtil.WriteCsv
y luego mostrar los datos CSV en la ventana de resultados de Linqpad aquí .Consejos:
Para obtener / crear un archivo CSV que esté en el mismo directorio que la consulta, puede usar:
var csvFile=Util.CurrentQueryPath.Replace(".linq", ".csv");
Si la tabla es grande, úsela
ObjectTrackingEnabled = false;
antes de escribir el CSV para evitar el almacenamiento en caché en la memoria.Si desea generar una tabla en formato XML en lugar de un archivo separado por comas, puede hacerlo como:
Este ejemplo devuelve todos los elementos que tienen el atributo
attr1
que contiene el valor"a"
de un archivo XML que tiene el mismo nombre que la consulta y está contenido en la misma ruta. Consulte este enlace para obtener más ejemplos de código.Util.GetPassword
Esto recuperará la contraseña del administrador de contraseñas incorporado de LinqPad. Para crear y cambiar la contraseña, abrir la opción de menú "Gestor de contraseñas" en el menú "Archivo" de LINQPad. Si no se guarda una contraseña cuando ejecuta el código C #, se abrirá un cuadro de diálogo de contraseña que le pedirá la contraseña y usted tiene la opción de crearla y guardarla sobre la marcha marcando la casilla de verificación guardar contraseña (en el ejemplo, la contraseña para "UserXY" se guardaría, y más tarde puede encontrar esta entrada en el Administrador de contraseñas ).
Las ventajas son que puede almacenar la contraseña en los LinqScripts que crea de forma segura, por separado y encriptada en el perfil de usuario de Windows (se almacena
%localappdata%\LINQPad\Passwords
como un archivo). LinqPad usa Windows DPAPI para proteger la contraseña.Además, la contraseña se almacena de forma centralizada, por lo que si necesita cambiarla, puede hacerlo en el menú e inmediatamente se aplica a todos los scripts que ha creado.
Notas:
Si no desea guardar la contraseña y solo aparece un cuadro de diálogo de contraseña, puede usar el segundo parámetro de la siguiente manera:
var pwd = Util.GetPassword("UserXY", true);
Esto desmarcará la casilla de verificación Guardar contraseña en el cuadro de diálogo de contraseña (sin embargo, el usuario aún puede marcarlo y elige guardar de todos modos).
Si necesita que la contraseña se almacene en a
SecureString
, puede usar esta función auxiliar (nb: para.ToSecureString()
usar el método de extensión , siga este enlace en Stackoverflow ; también le permite volver a convertirlo si es necesario):System.Security.SecureString GetPasswordSecure(string Name, bool noDefaultSave=true)
{
return Util.GetPassword(Name, noDefaultSave)
.ToSecureString();
}
Util.Cmd
Este método funciona como un procesador de comandos. Puede invocar todos los comandos que conoce desde la consola de Windows.
Ejemplo 1 - dir:
Esto generará el resultado del directorio sin la necesidad de
.Dump
hacerlo. Almacenarlo en una variable tiene la ventaja de que puede usar más consultas de Linq en él. Por ejemplo:Esto volcará todos los archivos con extensiones de archivo ".exe" o ".dll" contenidos en
C:\windows\system32
. El/s
interruptor se usa para repetir todos los subdirectorios y/b
se usa para el formato de salida simple. Tenga en cuenta que el segundo parámetro del método Cmd se especifica para suprimir la salida de la consola para mostrar solo el resultado filtrado utilizando el método Dump.Puede ver que esto es más flexible que los comodines que tiene,
dir
ya que puede usar toda la flexibilidad del motor de consultas de Linq.Ejemplo 2 - editor de texto:
Puede abrir un archivo en el Bloc de notas de esta manera:
Util.Image
Muestra imágenes de una URL. Ejemplo:
Util.ProgressBar, Util.Progress
El uso le
Util.ProgressBar
permite mostrar una barra de progreso. Puede usar la siguiente clase auxiliar:Simplemente utilícelo como se muestra en el siguiente ejemplo:
Alternativamente, puede usar
Util.Progress
para actualizar la barra de progreso integrada de LinqPads, por ejemplo:La diferencia es que no se mostrará en la ventana de resultados y no puede asignarle un mensaje.
Util.RawHtml
Muestra HTML en la ventana de salida. Ejemplo:
Hyperlinq, Util.HorizontalRun
Puedes usar esta función de ejemplo
para mostrar hipervínculos en la ventana de resultados, o cualquier acción como abrir su editor favorito. Uso:
Tenga en cuenta que esta función siempre funciona, mientras
new Hyperlinq ("http://myURL", "Web site").Dump();
que no funciona para algún tipo de URL (especialmente, si tiene que pasar nombres de puerto como ": 1234" como parte de la URL).Util.ReadLine
Lee la entrada de la consola. Ejemplo:
Como sinónimo de
Util.ReadLine<string>()
, puedes usarConsole.ReadLine()
también.¡Pero hay más! Puede crear un analizador JSON simple con el siguiente fragmento: bastante útil, por ejemplo, si desea analizar y probar una cadena JSON sobre la marcha. Guarde el siguiente fragmento como JSONAnalyzer.linq usando un editor de texto y luego ábralo en LinqPad (esto es para agregar las referencias fácilmente sobre la marcha):
Ahora puede ejecutarlo y simplemente pegar una cadena JSON desde el portapapeles en la consola, usará la
Dump
función para mostrarlo como un objeto agradable, y también recibirá los mensajes de error del analizador en la pantalla para solucionar problemas. Muy útil para depurar AJAX.Util.ClearResults
Si necesita borrar la ventana de resultados dentro de su script, use:
Úselo en la parte superior de su secuencia de comandos o, si está ejecutando múltiples consultas en una secuencia de comandos, debe esperar la entrada del usuario antes de borrar la pantalla (por ejemplo, precediéndola con
Util.ReadLine
).Custom .Dump () - ICustomMemberProvider
También es interesante, que puede cambiar la salida del
.Dump()
método. Simplemente implemente la interfazICustomMemberProvider
, p. Ej.Si crea una instancia de esta clase, como
entonces se dará salida única
Hint
,constMember1
,constMember2
, ymyprop
, pero no la propiedadxyz
:Mostrar un cuadro de mensaje o cuadro de entrada en LinqPad
Si necesita mostrar un cuadro de mensaje, mire aquí cómo hacerlo.
Por ejemplo, puede mostrar un InputBox utilizando el siguiente código
(no olvide presionar F4 y agregar Microsoft.VisualBasic.dll y sus espacios de nombres para que esto funcione)
Util.Run
( nuevo: disponible desde LinqPad versión v4.52.1 (beta) )
Le permite ejecutar otro script LINQPad desde su script o desde su propio programa .NET o servicio de Windows (haciendo referencia a la versión LINQPad4-AnyCPU de
LINQPad.exe
). Ejecuta el script tal como lolprun.exe
haría la herramienta de línea de comando .Ejemplos:
Este ejemplo ejecuta el script
foo.linq
, que contiene el siguiente código de muestra:Le permite verificar si el script se ejecutó desde el interior de la GUI de LinqPad o mediante
lprun.exe
o conUtil.Run
.Nota: Las siguientes variantes de invocación pueden ser útiles:
SubmitChanges () - Linq a SQL
Si está utilizando LinqToSQL , es posible que desee realizar cambios permanentes (para operaciones de inserción / actualización / eliminación ). Como el contexto de la base de datos está implícitamente hecho por LinqPad, debe llamar
SubmitChanges()
después de cada cambio como se muestra a continuación.Ejemplos para la base de datos (LinqPad-) Northwind :
Insertar
Actualizar
Eliminar
Nota: Para obtener ID válidos para los ejemplos anteriores, puede usar:
antes de invocarlos.
SaveChanges () - Entity Framework
Si está utilizando Entity Framework , es posible que también desee realizar cambios permanentes (para operaciones de inserción / actualización / eliminación ). Dado que LinqPad crea implícitamente el contexto de la base de datos, debe llamar
SaveChanges()
después de cada cambio como se muestra a continuación.Los ejemplos son básicamente los mismos que antes para LinqToSQL , pero debe usar
SaveChanges()
, y para insertar y eliminar los métodos también han cambiado.Insertar
Actualizar
Eliminar
Nota: Para obtener ID válidos para los ejemplos anteriores, puede usar:
antes de invocarlos.
this - contexto de la base de datos
En LinqPad , el contexto de la base de datos se aplica automáticamente mediante el cuadro combinado en la parte superior y seleccionando la base de datos adecuada para su consulta. Pero a veces, es útil hacer referencia explícita a él, por ejemplo, si copia algún código de su proyecto fuera de Visual Studio y lo pega en LinqPad.
Es muy probable que su fragmento de código tomado del proyecto de Visual Studio tenga este aspecto:
¿Ahora qué hacer con
dc
? Por supuesto, puede eliminar cada aparicióndc.
en su consulta, pero es mucho más fácil. Solo agregaen la parte superior de tu fragmento así:
¡y el código funcionará al instante!
this.Connection
Usando LinqPad con OleDb, convirtiendo una tabla de datos a un objeto Linq, consultas SQL en Linq
El siguiente fragmento de código le ayuda a usar LinqPad con OleDb. Agregue
System.Data.OleDb
desde elSystem.Data
ensamblaje a las propiedades de consulta, luego pegue el siguiente código enMain()
:Ahora agregue una conexión SqlServer a LinqPad y agregue la base de datos Northwind para ejecutar este ejemplo.
NB: si solo desea obtener la base de datos y el servidor de la conexión seleccionada actualmente, puede usar este fragmento de código:
Incluso puede convertir
myDS
a Linq, las respuestas a la siguiente pregunta muestran cómo hacerlo: buenos ejemplos de uso de .NET 4 palabra clave dinámica con LinqUn ejemplo más: suponga que su DBA le proporciona una consulta SQL y desea analizar los resultados en LinqPad, por supuesto, en Linq, no en SQL. Entonces puedes hacer lo siguiente:
En este ejemplo, la consulta SELECT del DBA simplemente se "arroja" al texto del comando y City filtra y ordena los resultados.
Por supuesto, este es un ejemplo simplificado, su DBA probablemente le dará un script más complejo, pero se está haciendo una idea: simplemente agregue una clase de resultado de soporte que contenga todos los campos de la cláusula SELECT y luego puede usarla directamente .
Incluso puede tomar el resultado de un procedimiento almacenado de esta manera y usarlo en Linq. Como puede ver, en este ejemplo no me importa el tipo de datos y lo uso
dynamic
para expresarlo.Así que se trata realmente de una programación rápida para poder analizar datos rápidamente. No debe hacer esto en su aplicación real por varias razones (inyección SQL, porque puede usar EF desde el principio, etc.).
PanelManager
Dibujar gráfico en LinqPad, parte 1
Para utilizar los ejemplos a continuación, presione F4y añadir
System.Windows.dll
,System.Windows.Forms.dll
,WindowsFormsIntegration.dll
,PresentationCore.dll
yPresentationFramework.dll
a su programa LINQPad y también agregar el espacio de nombresSystem.Windows.Shapes
.El primer ejemplo simplemente dibuja una línea:
El segundo ejemplo muestra cómo puede mostrar gráficos en LinqPad utilizando el PanelManager. Normalmente, LinqPad solo admite objetos Wpf. Este ejemplo se utiliza
System.Windows.Forms.Integration.WindowsFormsHost
para poner aWindows.Forms.PictureBox
disposición (se inspiró en esto ):Esto creará el siguiente gráfico (los elementos anteriores del panel "Gráfico" e "Imagen" se agregan):
Si desea mostrar las imágenes de la base de datos Northwind, puede hacer lo siguiente:
Cambiar el nombre del archivo de imagen a "NorthwindPics.jpg", luego agregar el siguiente código al comienzo del método Main () del segundo ejemplo :
Leerá el primer registro de la tabla Empleados y mostrará la imagen.
Consulte los siguientes enlaces para obtener más información:
Formas y dibujos básicos en visualizadores personalizados WPF
LinqPad
Nota: También puede lograr lo mismo sin el PanelManager, como muestra el siguiente ejemplo, que vi aquí :
Está utilizando el
.Dump()
comando para mostrarlo. Puede invocarimage.Dump()
varias veces y adjuntará la imagen.Windows Forms
Dibujar gráfico en LinqPad, parte 2
El siguiente ejemplo, inspirado en esta publicación, muestra cómo implementar un trazador de funciones simple en Linqpad 5 usando C # 7:
Está utilizando la capacidad de LinqPad para mostrar formularios de Windows en el panel de resultados. Añadir referencias (prensa ) : , , y añadir todos los espacios de nombres de estas asambleas.
F4
System.Drawing.dll
System.Windows.Forms.dll
System.Windows.Forms.DataVisualization.dll
Consejos adicionales / lecturas adicionales:
¿Quieres usar LinqPad en Visual Studio ? Así es como puedes hacer eso .
¿Necesita tener LinqPad como una "aplicación portátil" ? Lee aquí cómo hacerlo.
El sitio web de Joe para LinqPad es siempre una excelente fuente. Dentro de LinqPad,
Help -> What's New
le da pistas sobre nuevas funciones y métodos. El foro LinqPad también contiene consejos útiles.También muy útil: este artículo sobre la depuración de Linq (Pad).
Úselo
lprun.exe
para ejecutar consultas LINQ en sus scripts por lotes. Lea este artículo para más detalles. Por ejemplo:echo Customers.Take(100) > script.txt
lprun -lang=e -cxname=CompanyServer.CustomerDb script.txt
en este ejemplo, la consulta es una expresión LINQ simple. Por supuesto, también puede preparar consultas complejas utilizando
-lang=program
para activar el modo de programa.Puede escribir métodos de extensión y almacenarlos en la pestaña Mis consultas en el lado izquierdo de LinqPad: el último elemento del árbol se llama Mis extensiones ; haga doble clic en él para abrir un archivo donde pueda escribir extensiones que estén disponibles para todas sus consultas. Simplemente colóquelos en la clase estática pública
MyExtensions
y use elMain()
método para incluir pruebas para sus extensiones.fuente
Dump es un método de extensión global y SubmitChanges proviene del objeto DataContext que es un objeto System.Data.Linq.DataContext.
LP solo agrega Dump and Disassemble hasta donde yo sé. Aunque recomiendo encarecidamente abrirlo en Reflector para ver qué más hay allí que se pueda usar. Una de las cosas más interesantes es el espacio de nombres LINQPad.Util que tiene algunas ventajas utilizadas por LINQPad internamente.
fuente
.Dump()
o en cualquier otro método en el editor de origen, presione F12 para "reflejar". ¡Esto ahora está integrado en la herramienta!Alcancé el límite de texto de StackOverflow en mi respuesta anterior , pero todavía hay extensiones más interesantes en LinqPad. Una de ellas me gustaría mencionar:
Funciones de JavaScript (usando
.Dump()
)Desde la versión 5.42 beta de LinqPad, puede incorporar funciones de JavaScript y llamarlas directamente desde su código C #. Aunque esto tiene algunas limitaciones (en comparación con JSFiddle), es una buena manera de probar rápidamente algún código JavaScript en LinqPad.
Ejemplo:
En este ejemplo, una función
jsFoo
con un parámetro se prepara y almacena en la variableliteral
. Luego, se representa y se llama vía.Dump().HtmlElement.InvokeScript(...)
, pasando el parámetrotestparam
.La función de JavaScript se utiliza
external.Log(...)
para generar texto en las ventanas de salida de LinqPad, yalert(...)
para mostrar un mensaje emergente.Puede simplificar esto agregando la siguiente clase / métodos de extensión:
Entonces puede llamar al ejemplo anterior de la siguiente manera:
Eso tiene el mismo efecto, pero es más fácil de leer (si tiene la intención de hacer más JavaScript ;-)).
Otra opción, si le gustan las expresiones Lambda y no le gusta especificar el nombre de la función como cadena cada vez que lo llama, puede hacer lo siguiente:
siempre que haya agregado la función auxiliar
a la clase
ScriptExtension
. Esto resolverá el nombre de la variable que usó (aquíjsFoo
) que resulta ser el mismo nombre que la función de JavaScript en sí (tenga en cuenta cómo se usa la expresión lambda para resolver el nombre de la variable, esto no se puede hacer usandonameof(paramName)
dentro de la función)..Dump () - actualizar un mensaje en línea
A veces es útil sobrescribir el texto que volcó en lugar de ponerlo en una nueva línea, por ejemplo, si está realizando una consulta de larga duración y desea mostrar su progreso, etc. (consulte también ProgressBar a continuación). Esto se puede hacer usando un
DumpContainer
, puede usarlo como se muestra en elEjemplo 1:
Tenga en cuenta que para algunos objetos más complejos, es posible que tenga que usar en
dc.UpdateContent(obj);
lugar dedc.Content=...
.Ejemplo 2
Util.ProgressBar
También se puede mostrar el progreso utilizando una barra de progreso de la siguiente manera:
Ejemplo:
Esto es similar al ejemplo de volcado anterior, pero esta vez muestra una buena animación de barra de progreso.
Prueba unitaria con LinqPad - xUnit
¿Sabía que puede escribir pruebas unitarias en LinqPad? Por ejemplo, puede usar el marco xUnit. Está disponible a través del soporte NUGET de LinqPad, a través F4del diálogo, haga clic en Add NUGET..... Aquí hay una descripción paso a paso de cómo usar xUnit con LinqPad V5 o V6.
Si descubro más, actualizaré esta respuesta
fuente