C# 在Visual Studio 2017中,我如何使用;C“互动式”;窗口查询“我的”中的源;“数据连接”;

C# 在Visual Studio 2017中,我如何使用;C“互动式”;窗口查询“我的”中的源;“数据连接”;,c#,sql-server,visual-studio,visual-studio-2017,interactive,C#,Sql Server,Visual Studio,Visual Studio 2017,Interactive,我已在“数据连接”(在“服务器资源管理器”视图中)中连接到外部SQL server。我可以右键单击我的SQL源,然后单击“新建查询”以使用SQL语句快速查找数据 我想改用LINQ,我认为“C#Interactive”窗口将是一种快速的好方法。我的问题是,我不知道如何访问我的“开放”数据连接。无法识别数据库或表的名称。这应该可以 SELECT DB_NAME(dbid) as DBName, COUNT(dbid) as NoOfConnections, log

我已在“数据连接”(在“服务器资源管理器”视图中)中连接到外部SQL server。我可以右键单击我的SQL源,然后单击“新建查询”以使用SQL语句快速查找数据

我想改用LINQ,我认为“C#Interactive”窗口将是一种快速的好方法。我的问题是,我不知道如何访问我的“开放”数据连接。无法识别数据库或表的名称。

这应该可以

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

您可以查看此链接

我提出的解决方案可能并不完全符合您的要求,但我认为它将帮助您了解您需要什么。我做类似事情的一种方法是创建一个DA库,并在交互式窗口中使用它。以下是示例:

我将有一个类库项目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

你可以这样做,但我觉得这个流程需要比我想要的更多的工作和仪式,仍然是不完美的。不管怎样,这是实现你所追求的目标的一种方法。如果您喜欢使用
LINQ

进行查询,我还建议您使用
LinqPad
,我通过创建一个类库,打开到EF数据模型的连接,将DLL导入C#交互式窗口,并对数据模型执行LINQ语句来实现这一点

首先,创建类库,添加EF数据模型,并修改DbContext(entities)类以使用接受连接字符串的构造函数。您需要这样做才能从c#interactive窗口使用此库,因为如果不这样做,interactive窗口将查找带有连接字符串的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());
. }

是的,您可以在解决方案资源管理器中右键单击主项目,然后单击初始化与项目的交互。这将为您构建项目并将所有DLL导入交互式窗口。然后你就可以开始抓挠了

例如,使用实体框架,您需要建立
DbContext
。输入类似于

> var context = new My.Namespace.MyDataContext("blah blah blah");
在我写的“诸如此类”中,您需要添加连接字符串。交互式控制台不知道您的.config文件,因此您需要提供连接字符串

注意:要做到这一点,请确保在数据上下文中有
nameOrConnectionString
构造函数覆盖

现在您有了上下文,它和通常查询上下文一样简单

> context.Users.Where(u => u.IsActive).Select(u => u).ToList()
重要
请注意,我在查询的末尾没有使用分号(;)。这很重要,因为它告诉控制台输出查询/命令/代码行的值。如果你把它关掉,什么也不会发生


我的问题不是如何编写SQL语句,而是如何从C#interactive窗口连接到数据库(或者,由于连接已经在我的Data Connections窗口中建立,也许我应该将其称为访问打开的连接)…请注意,LINQPad是一个不错的选择,因为它将透明地为您创建表对象,因此您可以只关注查询。在C#Interactive中,您还需要为查询提供表对象。如果您的目的是编写特殊查询,为什么不直接查询SQL而不是通过交互式窗口?它会更快,并为您提供更多有用的数据。如果您的目的是检查您计划在代码中包含的内容的语法/结果,只需在该位置设置一个断点,您就可以使用数据访问,而无需做任何特殊操作。@Lunyx我在问题中逐字写下了我不想查询SQL的原因……值得注意的是,LinqPad不仅仅是LINQ。你可以把它用作任何东西的便笺簿。只需确保将查询类型更改为C#表达式以外的任何类型,并将
.Dump()
添加到要在结果窗口中输出的任何内容。是的,完全正确。Linqpad非常棒!