2009-05-12 12 views
18

Acabo de empezar a usar LINQPad y hasta ahora me gusta, pero la mayoría de los tutoriales que he encontrado para LINQ TO SQL hacen uso de una clase DataContext que Visual Studio genera para las actualizaciones persistentes, etc. También soy bastante nuevo en LINQ TO SQL por lo que mi pregunta es ¿cuál es el equivalente a lo siguiente en LINQPad (si lo hay) ...¿Hay un LINQPad equivalente a una clase DataContext?

MyDbDataContext db = new MyDbDataContext(); 

... 

db.SubmitChanges(); 
+1

La clase que se genera el código en forma parte de la DataContext generado para la base de datos seleccionada. Si necesita referirse al contexto de su código LINQPad, use "this". Nota: LINQPad no genera el contexto exactamente igual que LINQ to SQL, por lo que algunos casos extremos pueden no funcionar igual en LINQPad que con LINQ to Sql. –

Respuesta

30

respuesta corta: no es necesario para crear la DataContext mismo. LINQPad viene con muchas muestras, échele un vistazo.

Cuando conecta LINQPad a una base de datos, crea el DataContext por usted. Las tablas de DataContext (Table<T>) y SubmitChanges() están disponibles como miembros locales.

Por ejemplo, de LINQPad por defecto "C# expresión" modo que sólo puede escribir:

from p in Person 
where p.Name == "Joe" 
select p.Address 

En el modo "C# Declaración" de LINQPad:

var query = from p in Person 
      where p.Name == "Joe" 
      select p.Address; 

query.Dump(); // Dump() shows results below 

Person joe = query.First(); 
joe.Name = "Peter"; 
SubmitChanges(); 

joe.Dump(); // shows joe's values under the previous query results 

método de extensión Dump() de LINQPad es muy útil puede ser llamado a cualquier objeto o colección (en el modo de declaración de LINQPad) para mostrar los resultados a continuación.

Tenga en cuenta que ni siquiera necesita conectarse a una base de datos para usar LINQPad. Puede trabajar con colecciones en memoria:

int[] numbers = new[] { 1, 2, 3, 4, 5 }; 
numbers.Where(n => n > 3).Select(n => n * 2).Dump(); 

De hecho, ni siquiera es necesario utilizar LINQ utilizar LINQPad. También funciona muy bien como un compilador de fragmentos.

+2

¿Qué hay de insertar nuevos registros con LINQ to SQL y LINQPad? Intenté insertar invocando InsertOnSubmit() en una Tabla en mi base de datos con una columna de identidad y obtuve una excepción "La columna no se puede modificar". El Id nunca fue especificado. – jlafay

+0

@jlafay probablemente ya haya sido resuelto por largo tiempo, pero tal vez su TEntity no tenía una clave principal configurada. –

14

Sé que esto ya tiene una respuesta y estoy de acuerdo con Lucas, pero quería agregar un par de cosas que podrían ayudar a los lectores de esta pregunta.

Puede cargar su propio DataContext desde el ensamblaje si lo desea. Independientemente de si carga su propio Contexto o deja que LinqPad construya uno para usted, se está ejecutando en el contexto de una clase "UserQuery" que es generada por LinqPad.

La siguiente C# DECLARACIÓN muestra esto:

clase
this.GetType().Name.Dump(); // Shows UserQuery 

Este UserQuery deriva de un DataContext. En este ejemplo la dejo LINQPad construir un DataContext de la base de datos AdventureWorks:

this.GetType().BaseType.Dump(); // Shows TypedDataContext 

Si se me carga mi propia DataContext llamada MyDataContext:

this.GetType().BaseType.Dump(); // Shows MyDataContext 
12

Como se mencionó antes, no es necesario crea un DataContext ya que LINQPad crea uno por defecto.
Pero por si acaso, se necesita un segundo DataContext (para la misma base de datos) se puede utilizar

var secondDataContext = new UserQuery(); 

Esto creará una segunda DataContext al igual que la crea automáticamente una.

+0

¡Gracias! Eso es lo que se necesita para copiar y pegar consultas de visual studio a linqpad con solo este pequeño cambio; de lo contrario, tendremos que eliminar el contexto db. –

5

Basándome en la respuesta de jaraics, encontré que el constructor UserQuery requiere una cadena de conexión.Al menos lo hace para LINQPad versión 4.37.11. Por lo tanto, recuperé la cadena de conexión de la instancia de UserQuery creada por LINQPad y la utilicé para crear mi propia instancia.

var connectionString = this.Connection.ConnectionString; 
var secondDataContext = new UserQuery(connectionString); 

Cuando utilicé el código anterior, me dio un segundo DataContext.

+7

FWIW, esto ya no funciona (al menos con 4.42.01) ya que el ctor ahora toma un parámetro de IDbConnection en su lugar, por lo que ahora puede hacer var secondDataContext = new UserQuery (this.Connection); –

0

puedo acceder con el siguiente ejemplo cada vez que agrego un método estático fuera de la parte principal:

using(var VT = new LINQPad.User.TypedDataContext()) 
    return (from g in VT.GM_MEMBERS where g.Username == username select new { g.Password }).FirstOrDefault()?.Password; 
Cuestiones relacionadas