【问题标题】:LINQPad, using multiple datacontextsLINQPad,使用多个数据上下文
【发布时间】:2010-12-02 11:52:09
【问题描述】:

我经常比较不同数据库中表中的数据。这些数据库具有相同的架构。在 TSQL 中,我可以使用DB>user>table 结构(DB1.dbo.StoresDB2.dbo.OtherPlaces)来引用它们来拉取数据进行比较。我非常喜欢 LINQPad 的想法,但我似乎无法轻松地从同一组语句中的两个不同数据上下文中提取数据。

我看到人们建议简单地更改连接字符串以将数据从其他源提取到当前架构中,但正如我所提到的,这不会奏效。我只是跳过了常见问题解答中的一页吗?这似乎是一个相当常规的程序,我无法使用。

在“简单”的世界中,我希望能够简单地引用 LINQPad 创建的类型化数据上下文。然后我可以简单地:

DB1DataContext db1 = new DB1DataContext();
DB2DataContext db2 = new DB2DataContext();

然后从那里开始工作。

【问题讨论】:

    标签: c# linq linq-to-sql datacontext linqpad


    【解决方案1】:

    更新:现在可以在 LINQPad 中执行跨数据库 SQL Server 查询(从 LINQPad v4.31 开始,使用 LINQPad Premium 许可证)。要使用此功能,请在将数据库从 Schema Explorer 拖到查询窗口时按住 Control 键。

    也可以查询链接的服务器(您通过调用 sp_add_linkedserver 链接的服务器)。为此:

    1. 添加新的 LINQ to SQL 连接。
    2. 选择指定新数据库或现有数据库,然后选择您要查询的主数据库。
    3. 点击包括其他数据库复选框并从列表中选择链接服务器。

    【讨论】:

    • “错误:无效的对象名称'sys.servers'。”
    • 用户,请记住,它是跨数据库的,而不是跨服务器的——“多数据库查询仅支持同一服务器(或链接服务器)上的 SQL Server 数据库。”跨度>
    • 如果能够支持多个服务器,这些服务器并没有像 Scott 描述的多个数据上下文那样链接,那就太好了。
    • n.b.虽然这对 Linq-to-SQL 确实有效,但它不适用于 DbContext。我意识到这个问题是专门针对 Linq-to-SQL 的,但以防万一(像我一样)其他人没有正确阅读这个问题:-)
    • 在免费版本中有这个功能会很高兴
    【解决方案2】:

    请记住,您始终可以自己创建另一个上下文。

    public FooEntities GetFooContext()
    {
       var entityBuilder = new EntityConnectionStringBuilder        
                   {        
                        Provider = "Devart.Data.Oracle",        
                        ProviderConnectionString = "User Id=foo;Password=foo;Data Source=Foo.World;Connect Mode=Default;Direct=false",
                        Metadata = @"D:\FooModel.csdl|D:\FooModel.ssdl|D:\FooModel.msl"     
                    };
    
        return new FooEntities(entityBuilder.ToString());
    }
    

    【讨论】:

    • 什么是FooEntities?我可以在LINQPad里面写这段代码吗?如果可以,怎么写?
    • 这个答案默认假设您已经创建了一个包含类 FooEntities 的程序集。如果您只有一个连接字符串,它将如何工作?您需要添加哪个 NUGET 包才能拥有 EntityConnectionStringBuilder
    【解决方案3】:

    您可以根据需要实例化任意数量的上下文来分散 SQL 实例并执行伪跨数据库连接、复制数据等。注意,跨上下文的连接是在本地执行的,因此您必须调用 ToList()、ToArray() 等在加入之前分别使用各自的数据源执行查询。换句话说,如果您将来自 DB1.TABLE1 的 10 行与来自 DB2.TABLE2 的 20 行“内部”连接起来,则在 Linq 执行连接并返回相关/相交之前,必须将这两个集合(所有 30 行)都拉入本地计算机的内存中设置(每个示例最多 20 行)。

    //EF6 context not selected in Linqpad Connection dropdown
    var remoteContext = new YourContext();
    remoteContext.Database.Connection.ConnectionString = "Server=[SERVER];Database="
    + "[DATABASE];Trusted_Connection=false;User ID=[SQLAUTHUSERID];Password=" 
    + "[SQLAUTHPASSWORD];Encrypt=True;";
    remoteContext.Database.Connection.Open();
    var DB1 = new Repository(remoteContext);
    
    //EF6 connection to remote database
    var remote = DB1.GetAll<Table1>()
        .Where(x=>x.Id==123)
        //note...depending on the default Linqpad connection you may get 
        //"EntityWrapperWithoutRelationships" results for 
        //results that include a complex type.  you can use a Select() projection 
        //to specify only simple type columns
        .Select(x=>new { x.Col1, x.Col1, etc... })
        .Take(1)
        .ToList().Dump();  // you must execute query by calling ToList(), ToArray(),
                  // etc before joining
    
    
    //Linq-to-SQL default connection selected in Linqpad Connection dropdown
    Table2.Where(x=>x.Id = 123)
        .ToList() // you must execute query by calling ToList(), ToArray(),
                  // etc before joining
        .Join(remote, a=> a.d, b=> (short?)b.Id, (a,b)=>new{b.Col1, b.Col2, a.Col1})
        .Dump();
    
    localContext.Database.Connection.Close();
    localContext = null;
    

    【讨论】:

    • 你的意思是在底部关闭和 null localContext 或 remoteContext 吗?另外,YourContext 是在哪里定义的?
    • 我知道这是对上述评论的较晚回复,但 YourContext 会在需要的地方定义。我相信 localContext 应该是 remoteContext。从我使用它的方式来看,localContext 将是 Linqpad 文件的分配连接,remoteContext 是“第二个”上下文。谢谢@Adam
    【解决方案4】:

    我认为您无法做到这一点。见this LinqPad request.

    但是,您可以在单独的 dll 中构建多个 dbml 文件并在 LinqPad 中引用它们。

    【讨论】:

    • 到目前为止,这也是我的结论。我希望我错了!非常感谢。
    • 链接因 404 Page not found 错误而失效。
    • @MongZhu 我修复了链接,但现在另一个答案是正确的。
    【解决方案5】:

    拖放方法:按住 Ctrl 键同时拖动其他数据库 从模式资源管理器到查询编辑器。

    用例:

    //Access Northwind
    
    var ID = new Guid("107cc232-0319-4cbe-b137-184c82ac6e12");
    
    LotsOfData.Where(d => d.Id == ID).Dump();
    
    //Access Northwind_v2
    
    this.NORTHWIND_V2.LotsOfData.Where(d => d.Id == ID).Dump();
    

    【讨论】:

      【解决方案6】:

      据我所知,多个数据库仅在 LinqPad 的“付费”版本中可用(我所写的内容适用于 LinqPad 6 Premium)。

      更多详情,请参阅this answer in StackOverflow“多数据库支持”部分)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-15
        • 1970-01-01
        • 1970-01-01
        • 2022-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多