c# - for - r tools para visual studio
¿Cómo puedo usar, en Visual Studio 2017, la ventana "C#Interactive" para consultar una fuente en mis "Conexiones de datos" (4)
Conseguí que esto funcionara al crear una biblioteca de clases que abre una conexión a un modelo de datos EF, importando la DLL en la ventana interactiva de C # y ejecutando sentencias de Linq contra el modelo de datos.
Primero, cree la biblioteca de clases, agregue el modelo de datos EF y modifique su clase DbContext (entidades) para usar el constructor que toma una cadena de conexión. Debe hacer esto para usar esta biblioteca desde la ventana interactiva de c #, porque si no lo hace, la ventana interactiva buscará un archivo app.config con la cadena de conexión.
public partial class YourDBEntities : DbContext
{
public YourDBEntities(string connectionString)
: base(connectionString)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
....
}
Si su biblioteca de clases, agregue una clase con un método estático para obtener un contexto de datos:
public class AccessorClass
{
public static YourDBEntities GetDataContext()
{
return new YourDBEntities("metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=/";data source=xxxxxxx;initial catalog=xxxxxxx;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework/";");
}
}
Compile la biblioteca de clases y luego importe la DLL en su ventana interactiva, y consulte:
> #r "C:/Path.../bin/Debug/YourClassLibrary.dll"
> using YourClassLibrary;
> using (var ctx = AccessorClass.GetDataContext())
. {
. Console.Write(ctx.Orders.Where(c => c.ProjectID == 309).Count().ToString());
. }
Estoy conectado a un servidor SQL externo en mi "Conexiones de datos" (en la vista "Explorador de servidores"). Puedo hacer clic derecho en mi fuente de SQL y hacer clic en "Nueva consulta" para buscar rápidamente datos con sentencias de SQL.
Me gustaría usar LINQ en su lugar y creo que la ventana "C # Interactiva" sería una forma buena y rápida de hacerlo. Mi problema es que no sé cómo acceder a mi conexión de datos "abierta". El nombre de la base de datos o tablas no son reconocidos.
Esto podría funcionar!
SELECT
DB_NAME(dbid) as DBName,
COUNT(dbid) as NoOfConnections,
loginame as LoginName
FROM
sys.sysprocesses
WHERE
dbid > 0
GROUP BY
dbid, loginame
Puede consultar este enlace encontrar el número de conexión abierta en la base de datos
La solución que estoy proponiendo puede no ser exactamente lo que está buscando, pero creo que le ayudará a averiguar lo que necesita. Una forma en la que he hecho algo parecido es creando una biblioteca DA y usándola en la C# Interactive Window
. A continuación se muestra la muestra:
Tendría un proyecto de biblioteca de clases, MyProject.MyDA:
namespace MyDa
{
public class CustomerDa
{
public DataTable LoadData(string sqlCommandText = "")
{
//do your try catch finally and all the good stuff
var connString = @"Data Source=ServerName;Initial Catalog=AdventureWorks2014;Integrated Security=SSPI;";
var conn = new SqlConnection(connString);
SqlDataReader dataReader;
//you could accept the command text as a parameter
string sql = "select top 10 * FROM [AdventureWorks2014].[HumanResources].[Department]";
var result = new DataTable("Department");
conn.Open();
SqlCommand command = new SqlCommand(sql, conn);
dataReader = command.ExecuteReader();
result.Load(dataReader);
dataReader.Close();
command.Dispose();
conn.Close();
//instead of a datatable, return your object
return result;
}
}
}
Construye tu proyecto DA, ahora en C# Interactive
, harías algo como:
> #r "D:/blah/Blah/MyDa/bin/Debug/MyDa.dll"
> using MyDa;
> var a = new CustomerDa();
> var r = a.LoadData();
> r.Rows[0]
DataRow { HasErrors=false, ItemArray=object[4] { 1, "Engineering", "Research and Development", [4/30/2008 12:00:00 AM] }, RowError="", RowState=Unchanged, Table=[] }
> r.Rows.Count //you can do all the good LINQ stuff now on the result
10
Puede hacerlo de esta manera, pero creo que este flujo requiere más trabajo y ceremonia de lo que me gustaría y sigue siendo imperfecto. De todos modos, esa es una forma de lograr lo que estás buscando. También recomendaría usar LinqPad
si prefiere consultar usando LINQ
.
Sí, puede hacer clic con el botón derecho en su proyecto principal en el Explorador de soluciones y hacer clic en Inicializar interactivo con el proyecto . Esto construirá tus proyectos e importará todos los archivos DLL en la ventana interactiva para ti. ¡Entonces puedes empezar a rascarte!
Por ejemplo, al usar Entity Framework, tendrá que levantar su DbContext
. Introduce algo como ...
> var context = new My.Namespace.MyDataContext("blah blah blah");
Donde he escrito el "blah blah blah" necesitas agregar tu cadena de conexión. La consola interactiva no conoce sus archivos .config, por lo que debe proporcionar la cadena de conexión.
Nota: Para poder hacer esto, asegúrese de tener la
nameOrConnectionString
constructornameOrConnectionString
en su contexto de datos.
Ahora que tiene el contexto, es tan simple como normalmente consultar el contexto ...
> context.Users.Where(u => u.IsActive).Select(u => u).ToList()
Importante
Tenga en cuenta que he dejado el punto y coma (;) fuera del final de la consulta. Esto es importante ya que le dice a la consola que muestre el valor de la consulta / comando / línea de código . Nada pasará si dejas esto fuera.