在Visual Studio 2017中如何使用“C# Interactive”窗口查询我的“数据连接”中的源代码

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

我想使用 LINQ,我认为“C# 交互式”窗口是一个好的、快速的做法。我的问题是我不知道如何访问我的“打开”的数据连接。数据库或表的名称未被识别。


8
请注意,LINQPad是一个很好的选择,因为它会自动为您创建表对象,这样您就可以专注于查询而不必担心表对象。在C#交互式中,您还需要提供查询所需的表对象。 - K Scandrett
使用LINQPad,这是一个非常棒的工具。 - Brian Ogden
我认为这种方法是有缺陷的。如果你的目的是编写临时查询,为什么不直接通过SQL查询而不是通过交互式窗口呢?这样会更快,并提供更有用的数据。如果你的目的是检查你计划在代码中使用的语法/结果,只需在该位置设置断点,就可以使用数据访问而无需进行任何特殊操作。 - Lunyx
@Lunyx,我在我的问题中已经明确写出了为什么我不想查询SQL... - LDW
4个回答

8

是的,您可以在解决方案资源管理器中右键单击主项目,然后单击使用项目初始化交互。这将为您构建项目并将所有dll导入交互窗口。然后,您就可以开始编写代码了!

例如,如果使用实体框架,您需要启动您的DbContext。输入类似以下的内容...

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

在“blah blah blah”处,您需要添加连接字符串。交互式控制台不知道您的.config文件,因此您需要提供连接字符串。

注意:要能够执行此操作,请确保数据上下文具有"nameOrConnectionString"构造函数重载。

现在,您已经拥有上下文了,就像通常查询上下文一样简单...

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

重要提示
请注意,我在查询末尾没有加上分号 (;)。这很重要,因为它告诉控制台输出查询/命令/代码行的值。如果您忘记了添加分号,将不会发生任何事情。


6

我通过创建一个类库来使这个工作正常,该类库打开了一个EF数据模型的连接,将DLL导入到C#交互窗口中,并对数据模型执行Linq语句。

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

1

我提出的解决方案可能并不完全符合您的要求,但我认为它会帮助您找出您需要的内容。我做类似的事情的一种方式是创建一个DA库,并在C#交互窗口中使用它。以下是样本:

我将创建一个类库项目,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;
        }
    }
}

C# Interactive 中构建您的 DA 项目,您可以执行以下操作:
> #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进行查询。

值得注意的是,LinqPad 不仅仅是 LINQ。您可以将其用作任何东西的草稿本。只需确保将查询类型更改为除 C# 表达式之外的任何内容,并在要在结果窗口中输出的任何内容后添加 .Dump() - Michael Coxon
是的,完全正确。Linqpad非常棒! - haku

-5

这应该可以工作!

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

你可以查看这个链接 在数据库上找到打开连接的数量


1
我的问题不是如何编写SQL语句,而更多的是关于如何从C#交互窗口连接到数据库(或者,由于连接已经在我的数据连接窗口中建立,也许我应该将其表述为访问打开的连接)... - LDW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接