Как я могу использовать в Visual Studio 2017 окно "С# Interactive" для запроса источника в моих "Связи данных",
Я подключен к внешнему SQL-серверу в своих "Связи данных" (в представлении "Server Explorer" ). Я могу щелкнуть правой кнопкой мыши мой источник SQL и нажать "Новый запрос", чтобы быстро найти данные с помощью операторов SQL.
Я хотел бы использовать LINQ вместо этого, и я думаю, что "С# Interactive" будет хорошим и быстрым способом сделать это. Моя проблема в том, что я не знаю, как получить доступ к моему "открытому" соединению данных. Имя базы данных или таблиц не распознается.
Ответы
Ответ 1
Да, вы можете щелкнуть правой кнопкой мыши по вашему основному проекту в обозревателе решений и нажать Инициализировать интерактивный проект. Это создаст ваши проекты и импортирует все DLL в интерактивное окно для вас. Тогда вы можете начать царапины!
Например, используя Entity Framework, вам нужно встать на сторону DbContext
. Введите что-то вроде...
> var context = new My.Namespace.MyDataContext("blah blah blah");
Где я написал "бла-бла-бла", вам нужно добавить строку подключения. Интерактивная консоль не знает о ваших файлах .config, поэтому вам необходимо указать строку подключения.
Примечание. Чтобы это сделать, убедитесь, что в контексте данных есть переопределение конструктора nameOrConnectionString
.
Теперь, когда у вас есть контекст, он так же прост, как обычно запрашивает контекст...
> context.Users.Where(u => u.IsActive).Select(u => u).ToList()
Внимание!
Обратите внимание, что я оставил точку с запятой (;) в конце запроса. Это важно, поскольку он сообщает консоли, чтобы выводить значение запроса/команды/строки кода. Ничего не произойдет, если вы оставите это.
Ответ 2
Я получил это для работы, создав библиотеку классов, которая открывает соединение с моделью данных EF, импортирует DLL в интерактивное окно С# и выполняет инструкции Linq в отношении модели данных.
Сначала создайте библиотеку классов, добавьте модель данных EF и измените класс DbContext (сущностей), чтобы использовать конструктор, который принимает строку соединения. Вам нужно сделать это, чтобы использовать эту библиотеку из интерактивного окна С#, потому что если вы этого не сделаете, интерактивное окно будет искать файл app.config со строкой соединения.
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());
. }
Ответ 3
Решение, которое я предлагаю, может быть не совсем то, что вы ищете, но я думаю, что это поможет вам разобраться в том, что вам нужно. Один из способов, с которым я столкнулся, - создать библиотеку 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
, вы бы сделали так:
> #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
.
Ответ 4
Это должно работать!
SELECT
DB_NAME(dbid) as DBName,
COUNT(dbid) as NoOfConnections,
loginame as LoginName
FROM
sys.sysprocesses
WHERE
dbid > 0
GROUP BY
dbid, loginame
Вы можете проверить эту ссылку найти номер открытого соединения в базе данных