Как я могу использовать в Visual Studio 2017 окно "c# Interactive" для запроса источника в моих " подключениях к данным"

Я подключен к внешнему SQL server в моих "подключениях к данным" (в представлении "Обозреватель серверов"). Я могу щелкнуть правой кнопкой мыши источник SQL и нажать "новый запрос", чтобы быстро найти данные с помощью инструкций SQL.

Я хотел бы использовать LINQ вместо этого, и я думаю, что окно "c# Interactive" будет хорошим и быстрым способом сделать это. Моя проблема в том, что я не знаю, как получить доступ к моему "открытому" подключению к данным. Имя базы данных или таблиц не распознается.

4 ответов


Да, вы можете щелкнуть правой кнопкой мыши по своему основному проекту в Обозреватель и нажмите кнопку инициализировать Interacive с Project. Это позволит вам создавать проекты и импортировать все библиотеки DLL в интерактивное окно для вас. Тогда вы можете начать чесаться!

например, с помощью Entity Framework вам нужно будет встать ваш DbContext. Введите что-то вроде...

> var context = new My.Namespace.MyDataContext("blah blah blah");

где у меня написано "бла бла бла" вам нужно добавить свое соединение строка. Интерактивная консоль не знает о вашем .файлы конфигурации, поэтому вам нужно предоставить строку подключения.

Примечание: чтобы иметь возможность сделать это, убедитесь, что у вас есть nameOrConnectionString переопределение конструктора в контексте данных.

теперь, когда у вас есть контекст, это так же просто, как обычно запрашивать контекст...

> context.Users.Where(u => u.IsActive).Select(u => u).ToList()

важно
Обратите внимание, что я оставил с запятой (;) в конце запрос. Это важно, поскольку он сообщает консоли выводить значение запроса / команды/код. Ничего не случится, если вы оставите это.


я получил это для работы, создав библиотеку классов, которая открывает соединение с моделью данных EF, импортируя DLL в интерактивное окно C# и выполняя операторы Linq для модели данных.

сначала создайте библиотеку классов, добавьте модель данных EF и измените класс DbContext (entities), чтобы использовать конструктор, который принимает строку подключения. Это необходимо сделать, чтобы использовать библиотеку из интерактивного окна c#, так как в противном случае интерактивное окно будет искать приложение.файл конфигурации со строкой подключения.

public partial class YourDBEntities : DbContext
{
    public YourDBEntities(string connectionString)
        : base(connectionString)
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    ....
}

Если ваша библиотека классов, добавить класс со статическим методом для получения контекста данные:

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\";");
    }
}

скомпилируйте библиотеку классов, а затем импортируйте DLL в интерактивное окно и запросите:

> #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());
. }

решение, которое я предлагаю, может быть не совсем то, что вы ищете, но я думаю, что это поможет вам выяснить, что вам нужно. Один из способов сделать sth похожим-создать библиотеку DA и использовать ее в C# Interactive Window. Ниже приведен пример:

у меня был бы проект библиотеки классов, 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;
        }
    }
}

создайте свой проект DA, теперь в C# Interactive, вы бы сделали sth как:

> #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

вы можете сделать это таким образом, но я чувствую, что этот поток требует больше работа и церемонии, чем я хотел бы и все еще несовершенны. В любом случае, это один из способов достичь того, чего вы ищете. Я бы также рекомендовал использовать LinqPad если вы предпочитаете запроса с помощью LINQ.


Это должно работать !

    SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NoOfConnections,
    loginame as LoginName
    FROM
    sys.sysprocesses
    WHERE 
    dbid > 0
    GROUP BY 
dbid, loginame

вы можете проверить эту ссылку найти номер открытого соединения в базе данных