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

use*_*075 18 c# sql-server interactive visual-studio visual-studio-2017

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

我想改用LINQ,我认为"C#Interactive"窗口是一个很好的快速方法.我的问题是我不知道如何访问我的"开放"数据连接.无法识别数据库的名称.

Max*_*rek 6

我通过创建一个类库来打开与EF数据模型的连接,将DLL导入C#交互式窗口,并对数据模型执行Linq语句,从而实现了这一点.

首先,创建类库,添加EF数据模型,并修改DbContext(实体)类以使用带有连接字符串的构造函数.您需要这样做才能在c#interactive窗口中使用此库,因为如果不这样做,交互式窗口将查找带有连接字符串的app.config文件.

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

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

    ....
}
Run Code Online (Sandbox Code Playgroud)

如果你的类库,添加一个带有静态方法的类来获取数据上下文:

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\";");
    }
}
Run Code Online (Sandbox Code Playgroud)

编译类库,然后将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());
. }
Run Code Online (Sandbox Code Playgroud)


Mic*_*xon 6

是的,您可以在解决方案资源管理器中右键单击主项目,然后单击" 使用项目初始化Interacive".这将构建您的项目并将所有dll导入到交互式窗口中.然后你就可以开始刮擦了!

例如,使用实体框架,您需要站起来DbContext.输入类似......

> var context = new My.Namespace.MyDataContext("blah blah blah");
Run Code Online (Sandbox Code Playgroud)

在我写"blah blah blah"的地方你需要添加你的连接字符串.交互式控制台不知道您的.config文件,因此您需要提供连接字符串.

注意:为了能够执行此操作,请确保nameOrConnectionString在数据上下文中具有构造函数覆盖.

既然你有上下文就像通常查询上下文一样简单......

> context.Users.Where(u => u.IsActive).Select(u => u).ToList()
Run Code Online (Sandbox Code Playgroud)

重要
请注意,我已将分号(;)从查询末尾移开.这很重要,因为它告诉控制台输出查询/命令/ 代码行的值.如果你不这样做,什么都不会发生.